C#中的属性访问限制

时间:2018-04-09 08:58:05

标签: c# asp.net oop inheritance

试图了解背后的原因。

场景#1

public class Customer
{
   string _name = "Ram";
   //now trying to assign some new value to _name on the next line 
   _name // this property is inaccessible on this line.
}

场景#2

public class BaseCustomer
{
   protected string _name;
}


public class DerivedCustomer : BaseCustomer 
{
   _name //inaccessible here

   public void SetName()
   {
     _name = "Shyam"; //accessible here
   }
}

有人可以让我知道这背后的原因是什么?

2 个答案:

答案 0 :(得分:3)

简单。您不能在类上下文中进行变量赋值(不带声明)。您需要使用构造函数将赋值放入:

public class DerivedCustomer : BaseCustomer 
{
   public DerivedCustomer()
   {
       _name = "hello";
   }

   ...
}

......或者把它放在声明中:

public class BaseCustomer
{
   protected string _name = "hello";
}

答案 1 :(得分:2)

注意:专家可能会发现我的简化说明有例外。为了解释OP的关键意图,我保持简单。

在某种程度上,一个类实际上只包含声明。这可以是一个字段:

public class Customer
{
    private string _name;
}

或属性:

//Example 1 - Simple property
public class Customer
{
    public string Name { get; set; }
}

//Example 2 - Publically gettable (but not settable) property with private field (which is settable)
public class Customer
{
    private string _name;          //this is a field
    public string Name => _name;   //this is a property that relies on the field
}

或方法:

public class Customer
{
    public string GetName()
    {
          return "John";
    }
}

将其归结,我将其总结如下:

  

仅包含声明其结构的方式:字段,属性,方法。

     

直接包含代码(即使用字段/属性的逻辑)。

     

但是,类方法属性可以包含代码(即使用字段/属性的逻辑),但此代码被视为部分方法/属性,不属于类(直接)。

你要做的事对我来说没有意义。通过尝试访问这些位置的_name,我不太确定您希望实现的目标。

只有在您可以引用它的位置引用此字段才有意义:

  • 在方法正文中 - 如果您在方法执行期间需要该字段
  • 在属性中 - 在设置/获取属性期间使用该字段时
  • 在构造函数中 - 设置字段的值。

但是你试图在课堂上加入 。这提出了许多问题:

  • 你想用_name做什么?
  • 假设您可以参考您想要的字段;您希望何时执行此代码?
  • 与简单地使用方法(或构造函数)有什么不同?