2011-10-11 18 views
33

我有非常簡單的問題。 我爲你演示了一個非常簡單的功能問題。使用未分配的參數,c#

//主//

static void Main(string[] args)  
{ 
double[,] mydouble = new double[1, 4]; 
mynewMatrix(out mydouble);// call of method 
} 
public static void mynewMatrix(out double[,] d) 
{ 
    for (int i = 0; i < 4; i++) 
    { 
    d[0,i]=i; 
    } 
} 

//錯誤

使用未分配的輸出參數 'newMAt' 的輸出參數的 'newMAt' 必須分配給控制離開當前方法之前

我不知道問題在哪裏。

+5

錯誤消息非常明確。請準確描述你不瞭解的內容。 –

+3

我沒有看到任何'newMAt'參數。 – BoltClock

回答

70

如果陣列外的函數定義,你應該使用ref(或沒有,考慮到數組是引用類型)。 out表示該參數在函數返回之前將在函數中初始化。使用的一些例子:

static void Main(string[] args) 
{ 
    double[,] mydouble; 
    mynewMatrix(out mydouble);// call of method 

    double[,] mydouble2 = new double[1, 4]; 
    mynewMatrix2(mydouble2);// call of method 

    // useless for what you want to do 
    mynewMatrix3(ref mydouble2);// call of method 
} 

public static void mynewMatrix(out double[,] d) 
{ 
    d = new double[1, 4]; 

    for (int i = 0; i < 4; i++) 
    { 
     d[0, i] = i; 
    } 
} 

public static void mynewMatrix2(double[,] d) 
{ 
    for (int i = 0; i < 4; i++) 
    { 
     d[0, i] = i; 
    } 
} 

// useless for what you want to do 
public static void mynewMatrix3(ref double[,] d) 
{ 
    for (int i = 0; i < 4; i++) 
    { 
     d[0, i] = i; 
    } 
} 

我會補充說,如果你不知道什麼是ref之間的差異,out你能讀懂Difference between ref and out parameters in .NET

4

的錯誤信息是明確的 - 你需要一個值分配給你的輸出參數的方法內:

public static void mynewMatrix(out double[,] d) 
{ 
    d = new double[1, 4]; 
    for (int i = 0; i < 4; i++) 
    { 
     d[0,i]=i; 
    } 
} 

你的方法以外所作的分配沒有影響。就在寫這篇文章:

static void Main(string[] args)  
{ 
    double[,] mydouble; 
    mynewMatrix(out mydouble); 
} 
+5

不只是在返回之前,而是在方法內的* d中讀取*之前。 –

1

你是你的陣列參數的元素分配值,但你要的y值分配給數組本身,因爲它的定義爲out

d = new double[1, 4]; 
13

在C#中有兩個非常相似的關鍵字,refout

兩個人都按引用傳遞值,但不同的是:

當您使用ref編譯器會要求你指定調用方法的變量之前。

當使用out時,它不需要這個。這意味着您將無法假定該參數已被填充。您將無法在方法內讀取其值。

 

爲了說明這個問題,試想一下,如果別人寫了這個代碼調用你的方法會發生什麼:

double[,] myUnassignedDouble; 
mynewMatrix(out myUnassignedDouble); 

顯然,變量都不會被分配,這是不好的。

 

這讓你有三個選擇:

  1. 分配變量每次調用該方法,並使用void mynewMatrix(ref double[,] d)
  2. 分配變量一次,你的方法中,用時間void mynewMatrix(out double[,] d)
  3. 每次調用該方法並使用
時分配變量

第三個選項將起作用,因爲到目前爲止您不需要重新分配變量。顯然這可能會隨着代碼變得更復雜而改變。我假設你有第一個使用out的理由嗎?