2012-04-13 2 views
4

Wie ich es verstehe, Eigenschaften nicht Referenzen zurückgeben, und da structs Werttypen sind, gibt es keine Möglichkeit, einen Verweis auf eine Struktur über Eigenschaften zurückzukehren, die es ermöglichen würde:Aktivieren Sie die Eigenschaftensyntax für Verweise auf Strukturen?

public struct SomeStruct 
{ 
    public int SomeMember { get; set; } 
} 
class foo 
{ 
    private SomeStruct bar; 
    public SomeStruct Bar{ get { return bar; } set { bar = value; } } 
} 

//Somewhere else 
foo f = new foo(); 
f.Bar.SomeMember = 42; //Error, this doesn't work 

Werde ich zurückgreifen müssen setMemberOfSomeStruct() oder gibt es einen anderen Weg?

edit: Konkret möchte ich vermeiden, für solche Strukturen die ganze Zeit neu aufrufen zu müssen. Ich weiß, dass mit einem Konstruktor SomeStruct (int), das funktionieren würde:

f.Bar = new SomeStruct(42); //ugh 
+0

Verwenden Sie keine veränderlichen Strukturen, da sie böse sind. Verwenden Sie unveränderliche Strukturen. – Servy

+0

Seltsam. Ist das ein schlechter Entwurf in XNA? Es hat eine Struktur Rectangle mit 4 Ints. Ich muss nur zwei der 4 Eingänge sehr oft aktualisieren.Muss ich wirklich jedes Mal ein neues Rechteck erstellen, nur um dies zu tun? – TravisG

+0

Ja. Erstellen einer neuen Struktur ist keine teure Operation, es ist sehr billig. Das ist der Hauptgrund für die Verwendung von Strukturen an erster Stelle. – Servy

Antwort

2

Machen Sie Ihre struct Implementierungen unveränderlich und dies tun:

var newSomeStruct = new SomeStruct(42 /* Feeds SomeMember */); 
var myFoo = new Foo(); 
myFoo.Bar = newSomeStruct; 

public struct SomeStruct 
{ 
    private int _someMember; 

    public int SomeMember { get { return _someMember; } } 

    public SomeStruct(int someMember) 
    { 
     _someMember = someMember; 
    } 
} 

Immutable structs helfen, die Werttyp Semantik zu erhalten das wird erwartet.

Wenn Sie es nicht unveränderlich machen, dann ist der obige Code immer noch der einzige Weg, dies zum Laufen zu bringen.

Alternativ, aber nicht viel schöneren, eine Methode für die Klasse aussetzen die Klasse des Kopie SomeStruct einzustellen:

public void SetSomeMember(int val) 
{ 
    _bar.SomeMember = val; // Note _bar in this example is a field, not a property. 
} 

ich dies nur der Vollständigkeit halber bieten, würde ich immer noch die Unveränderlichkeit Weg gehen wie Es gibt Konsens darüber, dass "veränderbare Strukturen böse sind". Property Getter ist ein Problem, wie Casting auf Schnittstellen - unveränderliche Strukturen lösen diese.

Es gibt noch einen anderen scherzhaften Punkt - gehen Sie nicht davon aus, dass Leistungsprobleme existieren, bevor Leistungsprobleme tatsächlich existieren. Eine class Definition könnte genauso schnell sein wie eine struct für den Stil der Verwendung, die Sie daraus erhalten. Profiling ist König hier.

+0

Sorry, du warst ein bisschen zu schnell. Siehe meine Bearbeitung :) – TravisG

0

Sieht aus, als ob Sie eine veränderbare Struktur haben, which isn't recommended.

Aber um Ihre Frage direkt zu beantworten: Erstellen Sie eine Kopie, mutieren Sie das und legen Sie dann die Eigenschaft mit der mutierten Struktur.

var barCopy = f.Bar; 
barCopy.SomeMember = 42; 
f.Bar = barCopy; 

By the way:

Wie ich es verstehe, Eigenschaften nicht Referenzen zurück.

Natürlich können sie - Eigenschaften von Referenztypen Referenzen vom Getter zurückgeben.

Da Strukturen Werttypen sind, gibt es keine Möglichkeit, einen Verweis auf eine Struktur über Eigenschaften zurückzugeben.

Sicher gibt es, können Sie einen Verweis auf eine Box-Struktur zurückgeben. Beispiel:

public IComparable Property { get { return 42; } } 
+0

Ist ein Boxed 'struct' noch eine Kopie? http://blogs.msdn.com/b/abhinaba/archive/2005/10/05/477238.aspx –

+0

@Adam: Eine Kopie von was? In dem Beispiel, das ich zur Verfügung gestellt habe, wird es jedes Mal eine Box sein (also in diesem Sinne ist es eine Kopie), aber Sie können natürlich einmal boxen und eine stabile Referenz auf diese Box halten. – Ani

+0

Stimmt, aber das scheint den Anforderungen des OP nicht gerecht zu werden. Was seine Kommentare über das Zurückgeben von Referenzen anbelangt, nehme ich an, dass Sie feststellen, dass er sich auf die Rückgabe von Referenzen auf Werttypen bezieht. –

Verwandte Themen