2010-07-18 17 views
7

Das ist einfach zu erklären: das funktioniertStack-Überlauf Ausnahme in C# Setter

using System; 
using ConstraintSet = System.Collections.Generic.Dictionary<System.String, double>; 

namespace ConsoleApplication2 
{ 
    class test 
    { 
     public ConstraintSet a { get; set; } 
     public test() 
     { 
      a = new ConstraintSet(); 
     } 
     static void Main(string[] args) 
     { 
      test abc = new test(); 
      Console.WriteLine("done"); 
     } 
    } 
} 

dies nicht

using System; 
using ConstraintSet = System.Collections.Generic.Dictionary<System.String, double>; 

namespace ConsoleApplication2 
{ 
    class test 
    { 
     public ConstraintSet a { get { return a; } set { a = value; } } 
     public test() 
     { 
      a = new ConstraintSet(); 
     } 
     static void Main(string[] args) 
     { 
      test abc = new test(); 
      Console.WriteLine("done"); 
     } 
    } 
} 

ich eine Stapelüberlaufausnahme auf dem Setter in der zweiten Klasse bekommen, und ich tue Ich weiß nicht warum. Ich kann das erste Formular nicht verwenden, da es von Unity Engine nicht unterstützt wird

+0

'ich nicht das erste Formular verwenden können, da sie von der Einheit engine' nicht unterstützt wird ... Die erste Form ist eine Compiler-Ebene eine Abkürzung. Es sollte gut mit Unity-Engine funktionieren. – SLaks

+1

möglich Duplikat von [StackOverFlow auf Klasseneigenschaft] (http://StackOverflow.com/questions/680765/StackOverflow-On-Class-Eigenschaft) und viele andere. –

+0

Nö, Einheit C# Compiler unterstützt diese Syntax nicht – Patrik

Antwort

24

Wenn Sie a = value schreiben, rufen Sie den Property Setter erneut auf.

Um nicht-automatische Eigenschaften zu verwenden, benötigen Sie einen separaten privaten Trägerfeld zu erzeugen, wie folgt aus:

ConstraintSet a; 
public ConstraintSet A { get { return a; } set { a = value; } } 
+1

Nicht sicher, warum diese Antwort auch nicht datiert wird, da es informativer ist, dass Cory Larson ... –

+0

@Jon: Ich bin überrascht, ich habe überhaupt Stimmen, wenn ich nur gepostet Sekunden hinter dir: P. Ich war heute Morgen einfach zu benommen, um das Warum zu erklären, also sind beide SLaks und deine Antworten zweifellos besser. –

+0

@Cory: Ich hatte nichts besonders gegen deine Antwort, weil es das Problem gelöst hat - aber ohne das Warum. Möglicherweise mag jemand Leute mit hoher Repräsentation einfach nicht. –

15

Sie haben keine Unterstützung Variable deklariert - Sie haben nur eine Eigenschaft, deren Getter und Setter nennen sich selbst. Es ist mir nicht klar, warum die erste Form ist nicht von Unity unterstützt - was es ist möglich, bedeutet, dass das Äquivalent wird auch nicht unterstützt werden, aber es ist im Grunde diese:

private ConstraintSet aValue; 
public ConstraintSet a { get { return aValue; } set { aValue = value; } } 

Ich würde normalerweise haben konventionelleren Namen, natürlich - das bedeutet, dass Sie ohne die „value` Bit wegkommen kann:

private ConstraintSet constraints; 
public ConstraintSet Constraints 
{ 
    get { return constraints; } 
    set { constraints = value; } 
} 

um ein wenig genauer, warum Ihre aktuelle zweite Form zu geben eine StackOverflowException werfen, sollten Sie immer daran denken, dass Eigenschaften sind im Grunde verkappte Methoden. Ihr gebrochener Code sieht so aus:

public ConstraintSet get_a() 
{ 
    return get_a(); 
} 

public void set_a(ConstraintSet value) 
{ 
    set_a(value); 
} 

Hoffentlich ist es offensichtlich, warum diese Version den Stapel bläst. Die geänderte Fassung setzt nur eine Variable stattdessen die Eigenschaft wieder aufzurufen, so sieht es wie folgt aus, wenn erweitert:

private ConstraintSet aValue; 

public ConstraintSet get_a() 
{ 
    return aValue; 
} 

public void set_a(ConstraintSet value) 
{ 
    aValue = value; 
} 
+0

@Downvoter: Möchten Sie einen Grund angeben? –

+0

einfach Einheit C# Compiler unterstützt nicht, was visuelle C# tut. Dies liegt daran, dass es die Kompatibilität mit Mono beibehalten muss. – Patrik

+0

@Patrik: Mono unterstützt auch C# 3 ... C# 3 ist jetzt seit fast 3 Jahren draußen; Das ist nicht gerade ein neues Feature. –

3

Sie benötigen einen privaten Träger Variable in öffentliches Eigentum:

private ConstraintSet _a; 
public ConstraintSet a { get { return _a; } set { _a = value; } } 
3

Sie können nicht verwenden Derselbe Variablenname im Getter und Setter.
Dies wird dazu führen, dass es sich selbst anruft und stackoverflow wird. Zu viel Rekursion.
Sie erhalten eine Unterstützung Variable benötigen:

private ConstraintSet _a; 
public ConstraintSet a { get { return _a; } set { _a = value; } }