黑马程序员技术交流社区

标题: 属性的写法,它们的区别是什么? [打印本页]

作者: Mekor    时间: 2014-5-17 15:58
标题: 属性的写法,它们的区别是什么?
本帖最后由 Mekor 于 2014-5-17 20:26 编辑

我知道的有两种,如果还有其他的大家请补充(也可能这两种一样)
            private string color;

            public string Color
            {
                get { return color; }
                set { color = value; }
            }

另一种
public string Name { get; set; }
区别是什么?
最好通俗易懂。。。先谢谢了


作者: continue     时间: 2014-5-17 16:10
属性的本质里面就是两方法,写法就只是这两种,不过在get;set方法中可以写一些稍稍复杂的代码。
另外可以改为只读{get;}  或者只写{set;}的属性
作者: 方杰斌    时间: 2014-5-17 16:38
这个 就是所谓的 自动属性。      有好好处  和 弊端  参考下面的

=======================================
C#中get和SET,看来看去还是看不懂,通俗一点解释一下,用了有什么好处,不用会怎么样
如果你这样写是没有什么不一样的.
private int __Old;
public int Old{
get{return __Old;}
set{__Old = value;}
}

但是如果你这样写就不一样了.
private int __Old;
public int Old{
get{return __Old;}
set{// 这里加入了验证代码
if(value<0)
throw new ArgumentOutException("value", "输入值不能小于0");
__Old = value;
}

上面的例子说明属性中可以添加些代码进行处理. 也可以设置的访问的权限等.


在类中定义一个属性
public class Student
{
private string name
public string Name
{
set{name=value;}//这里是给私有属性name赋值
get{return name;}//这里取出私有属性name的值
}
}
c#在定义类时,通常要把类中声明的对象封装起来,使得外界不能访问这个属性。上述代码中如果去掉set部分,则外界只能读取name的值,如果去掉get部分,则只能给name赋值。这样就可以控制外界对私有属性name的访问权限了,这种写法是C#的一个特性。

当然你也可以通过自己创建函数来对name进行取值和赋值,但这样就显得比较麻烦了。


属性与普通变量不同就在于, 普通变量就是放在屋子里的东西, 是什么样明明白白. 而属性则是在屋子的门口放了个守门人, 你拿东西放东西要经过他.

这个守门人就是属性访问器, 拿东西就是 get, 放东西就是 set. 怎么拿怎么放是它说了算, 虽然你觉得好像就是直接拿直接放差不多.
GET SET 就是对外的接口 ,一般在实例中访问成员数据需要这个成员数据的访问方式为PUBLIC ,现在C#很高级了,GET 就是获取,SET 就是设置,但是它提供了跟好的收缩性,对GET 和SET 可以单独设置访问权限 比如你对某个成员数据只能读取或者只写,或者只有派生类可以访问等。。。 相对以前来说,没有属性访问器,需要通过函数来调用私有成员数据,属性提供了高效的访问模式和简单的书写。
就是为了安全啊~~
字段是你具体要操作的数据所以他的值不能出错,可是你又不能避免用户犯错~~
为了安全就用属性来给字段赋值,因为 在set中你可以对数据的安全进行验证,
get就更简单了验证完数据了就要把值给了字段所以要get
set的中文意思是“设置”;
get的中文意思是“获得”;

补充:

get 和 set 会在相应的时候自动调用
主要是为了隐藏程序内的数据结构时用
get是获取该属性的值,
set设置该属性的值。
在用set时有一个特殊的变量value
就是设置属性时的值

value 隐式参数,用于设置访问器以及添加或移除事件处理程序。

对类的属性进行 设置
比如用类名.属性=“”赋值 set作用
变量=类名.属性 取值 get 作用








=====================================
【如果 觉得有帮助  请把帖子  修改为    提问 结束   谢谢】
作者: 陈君    时间: 2014-5-17 17:29
我先前面两位朋友都没真正理解楼主问的是什么问题。这里我来谈谈我的看法。
先用代码来说明一切
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 论坛问题2
{
    class C
    {
        int i;
        public int I
        {
            get { return i; }
            set { i = value; }
        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 论坛问题2
{
    class Program
    {
        static void Main(string[] args)
        {
            C c = new C();
            c.I = 1;
            Console.Write(c.I);
            Console.ReadKey();
        }
    }
}
这里用创建了一个属性 int i;
public int I
{
get { return i; }
set { i = value; }
}这种是大家最常见的格式,因为是直接用快捷键创建出来的。
最后输出的结果是1.
然后在用楼主提到的那种属性格式来试试
public int I
{
get ;
set ;
}
最后输出的也是1;但是我们设断点来看看局部变量的值
图好像有点小,这里我们可以发现,我们的属性I的值为1;而i的值竟然是0;那是不是说明public int I
{
get ;
set ;
}这种方式的get,得到的其实是I的值呢?好像是这样的。
public int I
{
get { return i; }
set { i = value; }
}而这种属性如果我们把它改成
public int I
{
get return;
set { i = value; }
}这样会怎么样呢?是不是我们可以通过I改i的值,但是当我们需要通过I输出i的值的时候实际上输出的是I的值呢?
然后我们发现系统我们报错了。果然微软想得很全面,如果这种属性能编译通过的话,就会给用户照成很大的危害。因为属性是我们为了用来封装字段但是又想给别人留下来的接口。如果这种属性被允许的话,其它类的使用者就可能产生疑惑。


所以还是不要使用public int I
{
get ;
set ;
}这种属性比较好。


作者: Mekor    时间: 2014-5-17 20:23
方杰斌 发表于 2014-5-17 16:38
这个 就是所谓的 自动属性。      有好好处  和 弊端  参考下面的

===================================== ...

谢谢,有些语句还真是通俗易懂:D
作者: Mekor    时间: 2014-5-17 20:25
陈君 发表于 2014-5-17 17:29
我先前面两位朋友都没真正理解楼主问的是什么问题。这里我来谈谈我的看法。
先用代码来说明一切
using Syst ...

谢谢,写的很详细:D




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2