Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.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#_.net - Fatal编程技术网

C# 是否使字段仅可访问其相应的属性?

C# 是否使字段仅可访问其相应的属性?,c#,.net,C#,.net,假设我们有一个私人支持域和一个公开该域的私人财产。如果任何代码,甚至类中的代码,试图访问或修改字段(属性除外),而不将字段和属性封装在自己的对象中,C#是否支持属性或任何其他语法来强制编译器出错?请参见下面的一个简单示例 /// <summary> /// Class to cache and quickly access data. Please only use this class if 1) the data to be cached uses little memory

假设我们有一个私人支持域和一个公开该域的私人财产。如果任何代码,甚至类中的代码,试图访问或修改字段(属性除外),而不将字段和属性封装在自己的对象中,C#是否支持属性或任何其他语法来强制编译器出错?请参见下面的一个简单示例

/// <summary>
/// Class to cache and quickly access data. Please only use this class if 1) the data to be cached  uses little memory and 2) the number of DB reads is high and could cause a performance strain.
/// </summary> 
class BMIDataCache
{
    #region fields
        protected static BMITimedDictionary<String, Device> _devices;
    #endregion

    #region properties
    protected static BMITimedDictionary<String, Device> Devices
    {
        get
        {
            if (_devices == null)
            { 
                _devices = new BMITimedDictionary<String, Device>();
                //Do some other stuff later.
            }
            return _devices;
        }
        set
        {
            _devices = value;
        }
    }
public void Test1()
{ //Inside this method, trying to access _devices will cause a compiler error, but not Devices
}
}
//
///类来缓存和快速访问数据。请仅在以下情况下使用该类:1)要缓存的数据使用很少的内存;2)数据库读取次数较多,可能导致性能紧张。
///  
类数据缓存
{
#区域字段
受保护的静态BMITimedDictionary设备;
#端区
#区域属性
受保护的静态时间字典设备
{
得到
{
如果(_devices==null)
{ 
_设备=新的BMITimedDictionary();
//以后再做其他事情。
}
返回装置;
}
设置
{
_设备=价值;
}
}
公共void Test1()
{//在此方法中,尝试访问_设备将导致编译器错误,但不会导致设备错误
}
}
在C#中没有任何东西可以帮助您对同一类的成员隐藏
private
字段

您的选择:

  • 一些后期处理(即使用FxCop进行代码分析的自定义插件)
  • 将此字段/属性移动到基类中,并标记字段
    private
    。而不是将实际代码添加到派生类-这样派生类将无法访问字段
  • 使用包含接口

旁注:您将无法对反射隐藏字段…

不,您不能。私有成员可用于类中的所有方法。一个受保护的成员可用于类中的所有方法或任何从该类继承的类。看起来Roslyn应该可以这样做,尽管您需要某种约定,因为编译器没有“此字段A是该属性B的支持字段”的感觉。我的直接想法是“那是另一个类”-你有一个值和一个行为,你想完全控制这个值和行为。你不相信你自己的代码吗?原则上,你不应该“相信你自己的代码”“非常舒服。这是封装原理的一个主要原因。我知道我可以从一个具有私有字段和受保护属性的类派生,也可以让它保持原样,但我认为有理由问,是否有一些语法上更简单、更干净的方法可以在C#中实现这一点。很好的提示…你让我搜索,我发现了这个链接