A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

如下, 一开始以为是设置属性成功了, 后来发现把属性注释掉了以后还是能运行, 按理说private的修饰过应该另一个类访问不了才对, 属性注释掉以后程序应该不能运行才是. 到底哪里出了问题?
  1. [code]
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;

  6. namespace 类
  7. {
  8.     public class Person
  9.     {
  10.         private string name="葛杨杨";   //注意访问关键字是private的,必须声明为属性, 通过属性才能访问到
  11.       
  12.         //定义一个只读属性变量,只含有get方法
  13.        /* public string Name
  14.         {
  15.             get
  16.             {
  17.                 return name;
  18.             }
  19.             
  20.         }
  21.         */

  22.         public void SayHello()
  23.         {
  24.             Console.WriteLine("我叫{0}",name);
  25.         }
  26.     }

  27.     class Class1
  28.     {
  29.         static void Main(string[] args)
  30.         {

  31.             Person geyangPerson = new Person();

  32.             geyangPerson.SayHello();
  33.             Console.ReadKey();
  34.         }
  35.     }
  36. }
  37. [code]
复制代码

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

6 个回复

倒序浏览
你main方法中没有访问私有变量name啊,你只不过调用了SayHello();
方法,之后通过这个方法去调用name的,这样子方法和私有变量是在同一个类中啊 ,丝毫不会有影响?
目前你只要记住 geyangPerson.name才会报错就可以了!也就是对象直接访问私有变量是不可以的。

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

回复 使用道具 举报
在属性的访问声明中:只有get访问器,表明属性的值是只读的,不能改写。
回复 使用道具 举报
  1. private string name="葛杨杨";  
复制代码
这个name,在 public class Person{}内均可呗访问。
同理SayHello()自然可以访问name了。
限制读写属性在用get;set;限制。
回复 使用道具 举报
亲,你new完Person对象的缘故,new对象之后,它就能访问该类中所有类型的成员方法和属性,所以可以直接访问name;但是在其他类中,如果不new对象,而是直接访问private方法,显然是找不到它在哪儿的。

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

回复 使用道具 举报
您这种情况是定义了一个私有的name,但是你又在类内部定义了公有的方法来访问私有字段name(我私下里把这叫做间接访问,可能没人这么说。但我感觉这样容易理解),这是可以的。
然后你声明类对象的时候,这个对象就指向了类所在的堆,所以才会有类中的方法字段等。
当然,你可以通过反射来直接获得私有的变量。这时不需要用类中public的方法来访问都行。

这是你只要在你的主程序中加上以下代码,就来可以访问私有字段了  //即获得你程序中的 葛杨杨
Type t=typeof(Person);
            FieldInfo  m = t.GetField("name",BindingFlags.NonPublic|BindingFlags.Instance);
            object obj = Activator.CreateInstance(t);
           Console.WriteLine(m.GetValue(obj));
回复 使用道具 举报
在main方法中你是通过  geyangPerson.SayHello();调用方法,跟本没有直接使用 private name私有字段。所以跟本不会报错。
但是如果你把 geyangPerson.SayHello();改成了 geyangPerson.name;这一定是会报错。




回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马