【问题标题】:Property access restriction in C#C# 中的属性访问限制
【发布时间】:2018-04-09 08:58:05
【问题描述】:

试图找出背后的原因。

场景#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
   }
}

谁能告诉我这背后的原因是什么?

【问题讨论】:

  • 我认为您标记的行是_name = "Foo"; 是否正确?如果是这样,将其实际编辑到问题中会更加清晰。因为它是你有一个没有终止 ; 的裸变量,这在任何上下文中都是无效的代码。
  • 你如何推断​​它“不可访问”的结论?显示的 sn-ps 根本不是有效的 C# 语法。
  • @Fildor:每当我听到几乎所有开发人员都将某些东西称为“无法访问”时,这意味着“我在 IntelliSense 中找不到它”。跨度>
  • @Flater 是的 - 舒适的 IDE 的缺点......

标签: c# asp.net oop inheritance


【解决方案1】:

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

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

   ...
}

...或者放在声明中:

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

【讨论】:

  • 我的问题是这背后的原因是什么??
  • @Kgn-web 这没有意义。什么时候应该执行这样的代码?
【解决方案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做什么?
  • 假设您可以引用您想要的字段;您希望何时执行此代码?
  • 这与仅使用方法(或构造函数)有何不同?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-27
    • 2014-04-20
    • 2018-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-23
    • 1970-01-01
    相关资源
    最近更新 更多