C# 如何根据访问修饰符组合属性init和set?
我想要一个具有保护集和公共init访问限制的类/记录? 据我所知,这甚至不能通过显式实现如下“Set”接口来实现:C# 如何根据访问修饰符组合属性init和set?,c#,c#-9.0,C#,C# 9.0,我想要一个具有保护集和公共init访问限制的类/记录? 据我所知,这甚至不能通过显式实现如下“Set”接口来实现: public interface ISetData<T> { T Value { get; set; } } public class Data : ISetData<bool> { bool ISetData<bool>.Value { get => Value;
public interface ISetData<T>
{
T Value { get; set; }
}
public class Data : ISetData<bool>
{
bool ISetData<bool>.Value { get => Value; set => Value = value; } // Error The property Value has no setter
public bool Value { get; init; }
}
我知道最好通过一个功能请求来解决这个问题,但这不是本文的主题
那么对于“public init,但是受保护的set”场景有哪些解决方案呢?一个简单的答案是none
在C#9.0中,您可以拥有
init
或受保护集
,而不是两者都有。您可以拥有一个单独的受保护属性集,然后公共属性可以基于您的受保护属性。下面的例子
使用系统;
公共课程
{
公共静态void Main()
{
var example=新示例{Test=“hello world”};
例如,PrintProtectedTest();
Console.WriteLine(示例.Test);
示例.SetProtectedTest(“再见世界”);
Console.WriteLine(示例.Test);
}
}
课例
{
公共示例()
{
}
受保护字符串ProtectedTest{get;set;}
公共字符串测试
{
get=>ProtectedTest;
init=>ProtectedTest=值;
}
公共void SetProtectedTest(字符串测试)
{
保护测试=测试;
}
public void printedprotectedtest()
{
控制台写入线(受保护测试);
}
}
您可以在这里运行示例请参见抱歉,现在意识到这只是使用您刚才描述的支持字段的一个微小变化,可能不会增加太多内容。
public interface ISetData<T>
{
T Value { get; set; }
}
public class Data : ISetData<bool>
{
bool ISetData<bool>.Value { get => Value; set => _value = value; } // Fine
private bool _value;
public bool Value
{
get { return _value; }
init { }
}
}
public class Data
{
public bool Value { get; init; protected set; }
}