2016-12-07 40 views
1

我正在学习C#并遇到错误。我所有的方法都是公开的。我正在模拟一本书中的代码,其中指出“假设您定义了一个名为Vector的类,并且该Vector是一个引用类型并且具有一个名为Value的int成员变量”,并且它继承了Program.cs代码(我复制了该代码) 。所以我试图模拟Vector类,并且当我编译它时,由于其保护级别,Vector.Value无法访问。Vector.Value由于其保护级别而无法访问

的Program.cs:

using System; 

namespace ReferenceType 
{ 
    public class Program 
    { 
     public static void Main(string[] args) 
     { 
      Vector x, y; 
      x = new Vector(); 
      x.Value = 30; 
      Console.WriteLine(y.Value); 
      y.Value = 50; 
      Console.WriteLine(x.Value); 
     } 
    } 
} 

Vector.cs:

namespace ReferenceType 
{ 
    public class Vector 
    { 
     private int Value; 

     public int GetterSetter{ 
      get { return Value; } 
      set { Value = value; } 
     } 
    } 
} 
+1

哪儿了'GetterSetter'来自?你为什么要声明'Value'是私人的?在你的“假设:”引用中似乎没有提到那些东西。 –

+0

您创建了一个属性'GetterSetter'而不是'Value',并创建了一个名为'Value'的私有支持字段。我不认为这就是你想要做的。也许你想写'public int Value {get; set;}'或'int _value; public int Value {get {return _value;} set {_value = value}};'? –

+1

.NET中的属性不仅仅是getter/setter。它们很重要,是班级界面的一部分。它们分别出现在元数据中,被序列化/反序列化,映射到数据库表等。后台字段只是一个实现细节 –

回答

3

您尝试访问类Vector的private成员,但你有一个public属性,它暴露了privateValue ,这应该用来代替。

试试这个代码,

using System; 

namespace ReferenceType 
{ 
    public class Program 
    { 
     public static void Main(string[] args) 
     { 
      Vector x, y; 
      x = new Vector(); 
      // Assign integer value to our public property "GetterSetter" 
      x.GetterSetter= 30; 
      // Access value of "Value" via "GetterSetter" property 
      Console.WriteLine(x.GetterSetter); 
      y.GetterSetter= 50; 
      Console.WriteLine(y.GetterSetter); 
     } 
    } 
} 

更新它会更好地改变你的代码到

using System; 

namespace ReferenceType 
{ 
    public class Program 
    { 
     public static void Main(string[] args) 
     { 
      Vector x, y; 
      x = new Vector(); 
      x.Value = 30; 
      Console.WriteLine(x.Value); 
      y.Value = 50; 
      Console.WriteLine(y.Value); 
     } 
    } 
} 


//Vector.cs 
using System; 

namespace ReferenceType 
{ 
    public class Vector 
    { 
     private int _value; 

     public int Value{ 
      get { return _value; } 
      set { _value = value; } 
     } 
    } 
} 

你可以阅读更多关于访问修饰符这里msdn.microsoft.com/en-us/library/wxh6fsc7.aspx

+2

对此的解释是,您试图从类的外部访问一个'private'成员,实际上应该访问'GetterSetter',它暴露'private'字段'Value',并且也是'public'属性。 – ColinM

+0

@ColinM我不会让我的答案像第一次发布那样简单:) – gmetax

+0

非常感谢......这很有道理。什么把我扔掉了,它在书中说,x.Value = 30; // Value是在Vector类中定义的字段 – juice

相关问题