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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 有钱就有希望 中级黑马   /  2013-10-29 17:29  /  1773 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 有钱就有希望 于 2013-10-30 08:42 编辑

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            person p = new person();
            p.Name = "Tom";
                     Console.WriteLine(p.Name);
                      Console.ReadKey();
        }
    }
    class person
    {
        public string Name { get; set; }

              }
}
/////////////////////////////////////////////////   学到面向对象这里迷糊了,两段代码上面的get{}set{}没写东西。下面的写了代码在里面,这两种用法不知道他们到底有什么区别,这两种用法对代码有何影响,求一个详解...
namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            person p = new person();
                      p.Name3 = "Tom";
                       Console.WriteLine(p.Name3);
            Console.ReadKey();
        }
    }
    class person
    {
        public string Name2;
        public string Name3
        {
            get
            {
                return this.Name2;
            }
            set
            {
                this.Name2 = value;
            }
        }

    }
}


评分

参与人数 1技术分 +2 收起 理由
追溯客 + 2

查看全部评分

9 个回复

倒序浏览
本帖最后由 重新开始 于 2013-10-29 19:59 编辑

自动属性,有系统帮你完成,这两种方法没任何区别。
在 C# 3.0 和更高版本中,当属性的访问器中不需要其他逻辑时,自动实现的属性可使属性声明更加简洁。(MSDN_自动实现的属性
  1. 例如下面
  2. class myClass{
  3.         //一般属性用法
  4.         privae string name;
  5.         public string Name{
  6.                 get { return name;}
  7.                 set { name = value;}
  8.         }   
  9.         //自动属性
  10.         public string Name{
  11.                 get;
  12.                 set;
  13.         }
复制代码
如果需要对这个变量做一些其他逻辑的时候,就不能直接用了。 比如:
  1. String username;
  2. 你想限制这个用户名只能有10个字符长度
  3. public String UserName
  4. {
  5.         get{return username;}
  6.         set{if(value.Length<=10){username=value;}}
  7. }
复制代码

评分

参与人数 1技术分 +2 收起 理由
追溯客 + 2

查看全部评分

回复 使用道具 举报
   public string Name { get; set; }这种写法是简写,等同于private string name; public string Name{  get{ return value;} set{ this.name=value;}} 外部类可以调用属性方法对类中的字段进行操作

评分

参与人数 1技术分 +1 收起 理由
追溯客 + 1

查看全部评分

回复 使用道具 举报
重新开始 发表于 2013-10-29 17:54
自动属性,有系统帮你完成,这两种方法没任何区别。
在 C# 3.0 和更高版本中,当属性的访问器中不需要其他 ...

你的意思是如果属性里需要进行逻辑判断这类的情况下就不能简写。要是只设成只读只写然后里也不进行任何操作就可以用属性的简写方法么,他们的结果也是一样?
回复 使用道具 举报
如果楼主仅仅这段代码上说运行时两段结果一样,但是如果像下面这样,在set里面加一个限制,效果就不同了
class person
    {
        public string Name2;
        public string Name3
        {
            get
            {
                return this.Name2;
            }
            set
            {
if(Name2==null)
{
Console.WriteLine("输入错误,请重新输入姓名:");
}
else
{
this.Name2 = value;
}
               
            }

这样就可以对输入的结果进行判断了,楼主懂了不 ?
        }

    }
}

评分

参与人数 1技术分 +1 收起 理由
追溯客 + 1

查看全部评分

回复 使用道具 举报
有钱就有希望 发表于 2013-10-29 19:08
你的意思是如果属性里需要进行逻辑判断这类的情况下就不能简写。要是只设成只读只写然后里也不进行任何操 ...

是的,据我所知就是这样。
回复 使用道具 举报
两者本质上没什么区别
class person
    {
        public string Name { get; set; }

              }
是自动属性,程序生成时也会自动生成一个对应的字段,只是在自动属性中你不能对字段的赋值进行限定。
public string Name3
        {
            get
            {
                return this.Name2;
            }
            set
            {
                this.Name2 = value;
            }
        }
通过它你可以限定字段的赋值范围

评分

参与人数 1技术分 +1 收起 理由
茹化肖 + 1

查看全部评分

回复 使用道具 举报
public string Name { get; set; }是.net 3.0加入的新特性,编译后会自动生成一个与该属性的对应字段。功能与
public string Name{
get
             {
                 return this.Name;
             }
             set
             {
                 this.Name = value;
             }
         }
这种写法一样。
我想这是为了快速开发而加入的新写法,若想在访问器内做一些其他处理,只能用后一种老写法。

评分

参与人数 1技术分 +1 收起 理由
追溯客 + 1

查看全部评分

回复 使用道具 举报
你可以用反编译器看看。
回复 使用道具 举报
上面那种叫做自动属性,是属性的一种简写,两者并没有本质上的区别。如果不需要在get和set里写东西就用自动属性,但是如果需要对非法值进行过滤就不要用自动属性了,因为要在get或者set里面对非法值进行判断。自动属性只是为了书写简便

评分

参与人数 1技术分 +1 收起 理由
追溯客 + 1

查看全部评分

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