2009-09-02 12 views
67

varsayalım Ben:C# bir 'out' parametresi olarak bir özellik Geçme

public class Bob 
{ 
    public int Value { get; set; } 
} 

Ben

Int32.TryParse("123", out bob.Value); 

gibi bir takım parametre olarak Değer üyesini geçmek istiyorum ama olsun derleme hatası, "'out' argümanı değişken olarak sınıflandırılmamıştır." Bunu başarmak için herhangi bir yolu var mı, yoksa bir değişken ayıklamak zorunda gidiyorum, à la:

int value; 
Int32.TryParse("123", out value); 
bob.Value = value; 
+0

[olası özelliklerin dışarıya "veya" ref "parametrelerine geçirilmesi mümkün mü?) Olası kopyası (http://stackoverflow.com/questions/564557/is-it-possible-to-pass-properties-as -o-veya-ref-parametreler) – nawfal

cevap

75

açık bir şekilde otomatik uygulanan yerine bir alan ve "normal" bir özelliğini kullanmak olurdu özelliği:

Sonra
public class Bob 
{ 
    private int value; 
    public int Value 
    { 
     get { return value; } 
     set { this.value = value; } 
    } 
} 

bir çıkış parametresi olarak alan geçirebilirsiniz:

Int32.TryParse("123", out bob.value); 

Ama tabii, sadece içinde çalışacak aynı sınıf, alanın özel olduğu (ve olması gerektiği gibi).

Özellikler, bunu yapmanıza izin vermez. VB'de bile 'un numarasına bir özellik gönderebilir veya bir çıkış parametresi olarak kullanabilirsiniz, temel olarak fazladan bir geçici değişken vardır. Eğer TryParse dönüş değeri hakkında umursamadı Eğer

, her zaman kendi yardımcı yöntem yazabilirsiniz:

static int ParseOrDefault(string text) 
{ 
    int tmp; 
    int.TryParse(text, out tmp); 
    return tmp; 
} 

Sonra kullanın:

bob.Value = Int32Helper.ParseOrDefault("123"); 

Böylece hiç bir tek kullanabilirsiniz Bunu, birden fazla yerde yapmanız gerekse bile geçici değişken.

+1

Ben ilk yaklaşım ile sorun olduğunu düşünüyorum Eğer doğrudan alanı (mülk yerine) kullanırsanız, –

+0

@ Dreas: Varsa geçerli olabilir doğrulama kurallarını atlayarak olabilir Önceden bir autoimplemented özelliği, herhangi bir doğrulama kurallarına sahip olamaz ... –

+3

@Jon: ParseOrDefault örneğinde int.TryParse için int.Parse değerini değiştirmek istediğinizi düşünüyorum. – shahkalpesh

4

Bunu elde edebilirsiniz, ancak bir özellik ile değil.

public class Bob { 
    public int Value { get; set; } // This is a property 

    public int AnotherValue; // This is a field 
} 

Sen Value üzerinde out kullanamazsınız, ancak AnotherValue üzerinde can.

Bu

Int32.TryParse("123", out bob.AnotherValue); 

çalışacak Fakat, ortak kurallar bir sınıf alan herkese açık hale getirmemeyi söyler. Yani geçici değişken yaklaşımını kullanmalısınız.

+0

Oh evet * alan *, yanlış terimi kullandım. –