2011-10-11 24 views
33

Çok basit bir sorunum var. Sorunumu gösterebilmeniz için çok basit bir işlev yaptım.Atanmamış out parametresi kullanımı, C#

// ana //

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; 
    } 
} 

// hata

atanmamış dışarı parametresi 'newMAt' dışarı parametrenin

kullanın 'newMAt' kontrol akımı yöntemi terk etmeden önce atanmalıdır

Sorunun nerede olduğunu bilmiyorum. Hata mesajı açıktır

+5

Hata mesajı çok açık. Lütfen tam olarak neyi anlamadığınızı açıklayın. –

+3

Hiçbir "newMAt" parametresi göremiyorum. – BoltClock

cevap

70

, bir ref kullanmalıdır (ya hiç, dizi dikkate referans türüdür). out, parametrenin döndürmeden önce işlevde başlatılacağı anlamına gelir. kullanıma ilişkin bazı örnekler:

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; 
    } 
} 
Sana out ref arasındaki fark nedir biliyor ve yoksa ekleyeceğiz

Eğer Eğer dizi parametrenin elemanlarına değerler atayarak olan Difference between ref and out parameters in .NET

4

- Eğer yöntem içinde senin dışında parametreye bir değer atamak gerekir: Eğer yönteme dışında yapılan

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

atama etkisi yoktur. Sadece bunu yazmak: dizi işlevinin DIŞINDA tanımlanır

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

Geri dönüşten hemen önce değil, yöntem içinde "d" den * okuma * öncesinde. –

1

okuyabilir c In #

d = new double[1, 4]; 
13

iki çok benzer anahtar kelimeler ref vevardır: onun out olarak tanımlanan çünkü, ancak dizinin kendisine y değeri atamak zorunda. Bunlardan

Hem referans olarak değer geçirmek, ama fark:

Eğer ref kullandığınızda derleyici sizin değişken öncesinde yöntemini çağırarak atamak gerektirir.

out kullanırken, bunu gerektirmez. Bu, parametrenin zaten doldurulduğunu kabul edemeyeceğiniz anlamına gelir. Yöntemin içindeki değerini okuyamayacaksınız.

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

Açıkça değişken atanacak asla kötü:

 

sadece başkasının yöntem çağırmak için bu kodu yazdıysam ne olacağını hayal, sorunu göstermek için.

 

Bu üç seçenekli bırakır:

  1. atama değişken, yöntemini çağırın ve yöntemi içinde, bir kere atama değişkeni void mynewMatrix(ref double[,] d)
  2. kullanmak ve kullanmak her zaman void mynewMatrix(out double[,] d)
  3. Yöntemi her çağırdığınızda değişkeni atayın ve void mynewMatrix(double[,] d)
'ü kullanın.

Üçüncü seçenek işe yarayacaktır çünkü şimdiye kadar değişkeninizi yeniden atamanız gerekmiyor. Açıkçası bu, kodunuz daha karmaşık hale geldikçe değişebilir. İlk olarak out'u kullanmanın nedenlerini biliyor muydun?

İlgili konular