2010-12-07 7 views
6

Cela pourrait être boiteux, mais ici:C# initialisation question

public interface Interface<T> 
{ 
    T Value { get; } 
} 

public class InterfaceProxy<T> : Interface<T> 
{ 
    public T Value { get; set; } 
} 

public class ImplementedInterface: InterfaceProxy<Double> {} 

Maintenant, je veux créer une instance de la ImplementedInterface et initialiser ses membres.

Est-ce que cela peut être fait comme ceci (en utilisant des listes d'initialisation) ou le même comportement ne peut être atteint en utilisant le constructeur avec Double argument?

var x = new ImplementedInteface { 30.0 }; 
+0

Certainement pas boiteux, belle question. +1 – Gabe

Répondre

8

peut être fait par:

var x = new ImplementedInteface { Value = 30.0 }; 
+0

Vous avez manqué les parenthèses après le nom de la classe. –

+2

@Marcel Gheorghita, vous pouvez passer ce support. ce n'est pas nécessaire. –

+0

@Marcel - ceux-ci sont facultatifs. – Gabe

2

Vous devriez être en mesure de le faire:

var x = new ImplementedInterface {Value = 30.0}; 
2
var x = new ImplementedInterface() { Value = 30.0 }; 
0
var x = new ImplementedInterface { Value = 30.0 }; 
0

Vous pouvez certainement utiliser une liste d'initialisation, mais vous avez pour spécifier ce que 30.0 est (ceci est vrai pour toute liste d'initialisation, pas seulement le code ont):

var x = new ImplementedInteface { Value=30.0 }; 
2

La seule façon d'obtenir ce que vous êtes après est si votre classe implémente IEnumerable<T> et a une méthode Add:

public class MyClass : IEnumerable<double> 
{ 
    public void Add(double x){} 
} 

Ensuite, vous pouvez faire:

MyClass mc = new MyClass { 20.0 }; 

Évidemment ce n'est pas ce que vous voulez, parce que cela ne définit pas votre Value et il vous permet d'ajouter plusieurs valeurs:

MyClass mc = new MyClass { 20.0, 30.0 , 40.0 }; 

Il suffit d'aller avec l'objet standard comme les autres ont initialise souligné:

var x = new ImplementedInterface() { Value = 30.0 }; 
1

var instance = new ImplementedInterface { Value = 30.0 }; fonctionnera. Cependant, ce n'est pas vraiment le même ensemble d'opérations que les listes d'initialisation C++ - c'est un initialiseur d'objet. Il initialise la nouvelle instance via le constructeur par défaut, puis appelle les accesseurs de propriété pour chaque propriété. En d'autres termes, l'objet est construit avant l'exécution des setters de propriété. Si vous souhaitez que les valeurs des propriétés définies avant la fin de la construction de ImplementedInterface, vous devez écrire un constructeur, comme vous l'avez noté. Cette distinction de comportement n'a généralement pas d'importance, mais il est bon d'en être conscient.

1

Je ne suis pas sûr si vous avez une raison particulière d'utiliser les interfaces de cette façon, mais le code suivant pourrait fonctionner pour vous.

public class ImplementedInterface2 : List<double> { } 

public class test 
    { 
     public void x() 
     { 
      var x = new ImplementedInterface2() { 30.0 }; 
     } 
    }