2013-06-06 2 views
2

Вот как я это сейчас:Один вкладыш для установки различных модификаторов для получения/установки

protected bool __myMember = true; 
bool myMember { public get { return __myMember; } protected set { __myMember = value; } } 

Вот как я бы в идеале хотели бы сделать это (или что-то очень похожее):

public-get protected-set bool myMember = true; 

Возможно ли это? Или есть ли другой способ сократить, как я это делаю сейчас? Должен ли я не делать это?

Возможно, решение было бы, если бы мы могли создавать модификаторы в csharp ... Но я сомневаюсь, что мы сможем.

ответ

5

Просто

public bool myMember { get; protected set; } 

нет необходимости добавлять поле подложки.

В действительности поле поддержки все еще существует. Он скрыт и обрабатывается непосредственно компилятором, так как этот маленький кусочек IL демонстрирует

void Main() 
{ 
    myTest t = new myTest(); 
    Console.WriteLine(t.member); 
} 

class myTest 
{ 
    public bool member {get; protected set;} 
} 


IL_0000: newobj  UserQuery+myTest..ctor 
IL_0005: stloc.0  // t 
IL_0006: ldloc.0  // t 
IL_0007: callvirt UserQuery+myTest.get_member 
IL_000C: call  System.Console.WriteLine 

myTest.get_member: 
IL_0000: ldarg.0  
IL_0001: ldfld  UserQuery+myTest.<member>k__BackingField 
IL_0006: ret   

myTest.set_member: 
IL_0000: ldarg.0  
IL_0001: ldarg.1  
IL_0002: stfld  UserQuery+myTest.<member>k__BackingField 
IL_0007: ret   

myTest..ctor: 
IL_0000: ldarg.0  
IL_0001: call  System.Object..ctor 
IL_0006: ret 
+0

** D'oh **, отлично! Я действительно знал (о '{get; set;}' и забыл/подсознательно проигнорировал, что я мог бы исследовать его и расширять его как таковую: P Only ** issue ** здесь: ** не может инициализировать ** этим – cregox

+0

В соответствии со [C# Default Value Tables] (http://msdn.microsoft.com/en-us/library/83fhsxwc.aspx) значение по умолчанию для логического значения ложно. – Steve

+0

Да, но как насчет строк или разных типы, к которым я хочу фактически установить значение? – cregox

Смежные вопросы