Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 一个用于设置要获取/设置的不同修改器的内衬_C#_Getter Setter_Access Modifiers - Fatal编程技术网

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