定义属性时不用get和set区别大吗?

rock_333 2019-03-21 07:41:30
感觉定义属性时有get和set很麻烦,一大堆代码~~~,好像用途不大!就算不加也行,为什么要加??
...全文
417 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
mk_lucifer 2019-03-21
  • 打赏
  • 举报
回复
引用 17 楼 zhuowp 的回复:
[quote=引用 15 楼 胖叔叔写代码 的回复:]
[quote=引用 14 楼 mk_lucifer 的回复:]
IL_0000: call int32 aaa.Program::get_A()
这是 a=A; 的编译结果,还说不是函数,不觉得大连么。。。

我没有说访问器不是函数,但是你
引用
属性实际上是两个函数get函数,和set函数,也可以只有一个,它本身并不是字段,也不需要数据内存,因为他本质是函数

的想法不是很准确。
属性是一个集合,他的确包含两个函数作访问器,但是他还包含其他的东西。
你这样就会陷入3.ToString()中int数字3到底是什么的坑里无法自拔。[/quote]他的说法没什么问题啊,属性其实就是一个语法糖而已,编译成IL之后就是get set俩方法。

如果时普通有字段支持的属性,get set就是操作对应的字段,如果是自动属性,编译器就给类添加一个同样的字段。[/quote]
我感说他肯定没用过 java, 不知道java 属性是怎么写的。。
zhuowp 2019-03-21
  • 打赏
  • 举报
回复
引用 15 楼 胖叔叔写代码 的回复:
[quote=引用 14 楼 mk_lucifer 的回复:]
IL_0000: call int32 aaa.Program::get_A()
这是 a=A; 的编译结果,还说不是函数,不觉得大连么。。。

我没有说访问器不是函数,但是你
引用
属性实际上是两个函数get函数,和set函数,也可以只有一个,它本身并不是字段,也不需要数据内存,因为他本质是函数

的想法不是很准确。
属性是一个集合,他的确包含两个函数作访问器,但是他还包含其他的东西。
你这样就会陷入3.ToString()中int数字3到底是什么的坑里无法自拔。[/quote]他的说法没什么问题啊,属性其实就是一个语法糖而已,编译成IL之后就是get set俩方法。

如果时普通有字段支持的属性,get set就是操作对应的字段,如果是自动属性,编译器就给类添加一个同样的字段。
mk_lucifer 2019-03-21
  • 打赏
  • 举报
回复
引用 15 楼 胖叔叔写代码 的回复:
[quote=引用 14 楼 mk_lucifer 的回复:]
IL_0000: call int32 aaa.Program::get_A()
这是 a=A; 的编译结果,还说不是函数,不觉得大连么。。。

我没有说访问器不是函数,但是你
引用
属性实际上是两个函数get函数,和set函数,也可以只有一个,它本身并不是字段,也不需要数据内存,因为他本质是函数

的想法不是很准确。
属性是一个集合,他的确包含两个函数作访问器,但是他还包含其他的东西。
你这样就会陷入3.ToString()中int数字3到底是什么的坑里无法自拔。[/quote]
集合就有存储空间,属性有么??他只有各类结构而已,我说get,set是两个函数,你现在又说访问器是函数,能不看结构只看 字节码么?只有字节码的才是程序,其他都是类结构描述,程序调的时候都当函数调,你在这说这个,属性本身只有一个结构公布的意义,本身没数据存储位置,我只是说了句使用属性相当于调用函数,你在这和我杠。。。
  • 打赏
  • 举报
回复
引用 14 楼 mk_lucifer 的回复:
IL_0000: call int32 aaa.Program::get_A() 这是 a=A; 的编译结果,还说不是函数,不觉得大连么。。。
我没有说访问器不是函数,但是你
引用
属性实际上是两个函数get函数,和set函数,也可以只有一个,它本身并不是字段,也不需要数据内存,因为他本质是函数
的想法不是很准确。 属性是一个集合,他的确包含两个函数作访问器,但是他还包含其他的东西。 你这样就会陷入3.ToString()中int数字3到底是什么的坑里无法自拔。
mk_lucifer 2019-03-21
  • 打赏
  • 举报
回复
IL_0000: call int32 aaa.Program::get_A()
这是 a=A; 的编译结果,还说不是函数,不觉得大连么。。。
mk_lucifer 2019-03-21
  • 打赏
  • 举报
回复
引用 9 楼 胖叔叔写代码 的回复:
至于提问题的楼主,你可以好好看看这里

https://docs.microsoft.com/zh-cn/dotnet/csharp/properties

你可以认为一个类中公有的字段和属性没有区别,但是当你用到高级的反射等特性时,属性和类中的公有字段就开始有一些区别了,根据你的需求你可以定义属性是费事的无用的功能。

但是当你需要用到属性的高级功能时,你会发现属性比字段更好用。


.method private hidebysig specialname static
int32 get_A() cil managed
{
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
// 代码大小 6 (0x6)
.maxstack 8
IL_0000: ldsfld int32 aaa.Program::'<A>k__BackingField'
IL_0005: ret
} // end of method Program::get_A
这是 get,set的反编译结果,写着.method
mk_lucifer 2019-03-21
  • 打赏
  • 举报
回复
引用 9 楼 胖叔叔写代码 的回复:
至于提问题的楼主,你可以好好看看这里

https://docs.microsoft.com/zh-cn/dotnet/csharp/properties

你可以认为一个类中公有的字段和属性没有区别,但是当你用到高级的反射等特性时,属性和类中的公有字段就开始有一些区别了,根据你的需求你可以定义属性是费事的无用的功能。

但是当你需要用到属性的高级功能时,你会发现属性比字段更好用。

你用C语言裸调一下控件属性,你看看那是个什么东西,是不是函数指针,这都是传承过来东西,字段是直接有数据内存空间的,属性有么???
qq14923349 2019-03-21
  • 打赏
  • 举报
回复
wpf中属性概念比较重要 绑定必须是属性
mk_lucifer 2019-03-21
  • 打赏
  • 举报
回复
引用 8 楼 胖叔叔写代码 的回复:
[quote=引用 7 楼 mk_lucifer 的回复:]
属性最早来源于 ActiveX 控件,他是一个基本定义,凡是定义成属性的,都可以公开被其他程序作为组件使用,字段则无法公开。。。属性实际上是两个函数get函数,和set函数,也可以只有一个,它本身并不是字段,也不需要数据内存,因为他本质是函数。。。


不知道你的这些观点是哪里来的,我只知道这是错误的:

https://docs.microsoft.com/zh-cn/dotnet/csharp/properties

引用
属性定义包含 get 和 set 访问器的声明,这两个访问器用于检索该属性的值以及对其赋值:


这段话在官方文档中存在,你有时间还是好好啃啃官方文档,不然未来你在团队合作中会产生误解或其他问题。[/quote]

那你就继续啃书本吧。我GetSetMethod只是获得了个访问器,能告诉我属性值在呢存的么???我get个随机数,你告诉我存在哪??各有各的理解,属性只是个概念,在其他语言里,需要明确指出了属性使用的方法名,C#需要而已。。。
  • 打赏
  • 举报
回复
至于提问题的楼主,你可以好好看看这里 https://docs.microsoft.com/zh-cn/dotnet/csharp/properties 你可以认为一个类中公有的字段和属性没有区别,但是当你用到高级的反射等特性时,属性和类中的公有字段就开始有一些区别了,根据你的需求你可以定义属性是费事的无用的功能。 但是当你需要用到属性的高级功能时,你会发现属性比字段更好用。
  • 打赏
  • 举报
回复
引用 7 楼 mk_lucifer 的回复:
属性最早来源于 ActiveX 控件,他是一个基本定义,凡是定义成属性的,都可以公开被其他程序作为组件使用,字段则无法公开。。。属性实际上是两个函数get函数,和set函数,也可以只有一个,它本身并不是字段,也不需要数据内存,因为他本质是函数。。。
不知道你的这些观点是哪里来的,我只知道这是错误的: https://docs.microsoft.com/zh-cn/dotnet/csharp/properties
引用
属性定义包含 get 和 set 访问器的声明,这两个访问器用于检索该属性的值以及对其赋值:
这段话在官方文档中存在,你有时间还是好好啃啃官方文档,不然未来你在团队合作中会产生误解或其他问题。
mk_lucifer 2019-03-21
  • 打赏
  • 举报
回复
属性最早来源于 ActiveX 控件,他是一个基本定义,凡是定义成属性的,都可以公开被其他程序作为组件使用,字段则无法公开。。。属性实际上是两个函数get函数,和set函数,也可以只有一个,它本身并不是字段,也不需要数据内存,因为他本质是函数。。。
mk_lucifer 2019-03-21
  • 打赏
  • 举报
回复
一个对于界面来说属性和字段的不同功能就是,字段不能被控件绑定,属性可以。。。对于绑定者(控件)属性可以提供自动更新通知功能,也就是可以实现,属性变了,前台控件显示自动变,字段不能绑定控件。。。 本质上不同,用途差别更大。。。
mk_lucifer 2019-03-21
  • 打赏
  • 举报
回复
没有get ,set那就不叫属性,那叫字段,这是最基本的语法理解错误,属性和字段是本质上完全不同的东西。。。
听雨停了 2019-03-21
  • 打赏
  • 举报
回复

public class Person
    {
        private int age;//字段一般情况下都是私有的

        //属性本质上就是一个字段和两个方法
        //这也就是为什么不写字段,你也可以通过属性赋值取值的原因        
        public int Age { get; set; }
        //private int <Age>k__BackingField;
        //public void set_Age(int value)
        //{
        //    this.<Age>k__BackingField = value;
        //}
        //public int get_Age()
        //{
        //    return this.<Age>k__BackingField;
        //}

        //属性就是为了封装字段用的,如果要控制属性的读写,那就需要申明一个字段
        //比如说你要给Age属性赋值,但是你的Age总不能是负数吧
        //就可以在这里进行控制,如果你只用字段,那就没有办法去控制这个了
        //public int Age
        //{
        //    get { return this.age; }
        //    set {
        //        if (value > 100 || value < 0)
        //        {
        //            this.age = 0;
        //        }else
        //        {
        //            this.age = value;
        //        }
        //    }
        //}

    }
个人理解,有错误请指出。
正怒月神 2019-03-21
  • 打赏
  • 举报
回复
定义set和get,可以控制字段的只读只写。这就是属性。 而且我记得序列化时,也是要靠属性完成,字段好像有问题。
秋的红果实 2019-03-21
  • 打赏
  • 举报
回复
简单点就

class myc
{
    public string name{get;set;}
}

myc newObj=new myc{name="name1"};

//或者
myc newObj=new myc();
newObj.name="name1";

这样就方便赋值 再不能省略了,要是写成

class myc
{
    public string name;
}
需要通过构造函数赋值,不方便 当然,属性的用途,可不仅是赋值方便这点,lz自己搜下
stherix 2019-03-21
  • 打赏
  • 举报
回复
但是很多属性都不是那么简单的 比如一个Label的Text属性 set里面还会先检查文本有没有变化,如果有变化就会去刷新控件显示的文字 你也可以就写{get;set}来生成默认的属性读写方法

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧