C# 一个用于设置要获取/设置的不同修改器的内衬
我现在是这样做的:C# 一个用于设置要获取/设置的不同修改器的内衬,c#,getter-setter,access-modifiers,C#,Getter Setter,Access Modifiers,我现在是这样做的: protected bool __myMember = true; bool myMember { public get { return __myMember; } protected set { __myMember = value; } } 以下是我理想的做法(或类似的做法): 这可能吗?或者有没有其他方法可以缩短我目前的工作时间?我应该不应该这样做吗 也许我们可以在csharp中创建修饰符。。。但我怀疑我们能做到。很简单 public bool myMember {
protected bool __myMember = true;
bool myMember { public get { return __myMember; } protected set { __myMember = value; } }
以下是我理想的做法(或类似的做法):
这可能吗?或者有没有其他方法可以缩短我目前的工作时间?我应该不应该这样做吗
也许我们可以在csharp中创建修饰符。。。但我怀疑我们能做到。很简单
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
void Main()
{
myTest t=新的myTest();
控制台写入线(t成员);
}
类myTest
{
公共bool成员{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_成员
IL_000C:call System.Console.WriteLine
myTest.get_成员:
IL_0000:ldarg.0
IL_0001:ldfld UserQuery+myTest.k_ubackingfield
IL_0006:ret
myTest.set_成员:
IL_0000:ldarg.0
IL_0001:ldarg.1
IL\u 0002:stfld UserQuery+myTest.k\u BackingField
IL_0007:ret
myTest..ctor:
IL_0000:ldarg.0
IL_0001:调用系统对象
IL_0006:ret
D'oh,太棒了!我实际上知道(关于{get;set;}
并且忘记了/下意识地忽略了,我可以对其进行调查并进行扩展。:P此处唯一的问题:无法使用此选项进行初始化。根据默认值,布尔值的默认值为falseYes,但对于我想要实际设置值的字符串或不同类型,该怎么办?我认为这就是backin存在的原因g字段和更详细的方法。顺便说一句,简化方法只是一个隐藏后台字段的系统,后台字段由编译器直接处理。别忘了,您总是可以初始化构造函数中的属性。实际上,当您有自初始化字段时,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