递归火山软件开发平台

标题: 公开成员变量方式读写有什么缺点? [打印本页]

作者: hs999xl    时间: 2023-12-26 16:57
标题: 公开成员变量方式读写有什么缺点?
(, 下载次数: 57)
公开成员变量也能读写
定义属性读、写方法也能读写
这有什么区别吗?

作者: TianYa    时间: 2023-12-26 17:36
同问????
作者: b0y    时间: 2023-12-26 17:48
用属性写  可能是可以过滤一些不要的值吧
作者: 呵呵仙8    时间: 2023-12-26 17:53
区别应该就是省去了套娃吧!!
作者: xrea    时间: 2023-12-26 18:12
这涉及到软件架构设计了,直接公开类成员变量不利于解耦
作者: Xelloss0618    时间: 2023-12-26 18:13
属性读和属性写,本质是方法,只是做了个语法糖,把赋值和取值搞到和变量一样。
既然是方法,那它自然不是只读写成员变量,而是可以做很多事。
作者: 明靓    时间: 2023-12-26 18:52
直接公开变量,有些地方会不安全地写,会产生一些意外的结果,而把变量隐藏起来,只通过属性写方法来操作,就会安全得多,不会产生意外结果.
作者: hs999xl    时间: 2023-12-26 19:00
明靓 发表于 2023-12-26 18:52
直接公开变量,有些地方会不安全地写,会产生一些意外的结果,而把变量隐藏起来,只通过属性写方法来操作,就会 ...

想请教下,不安全的写是什么?如何操作变量是不安全的?
作者: 创世魂    时间: 2023-12-26 19:03
hs999xl 发表于 2023-12-26 19:00
想请教下,不安全的写是什么?如何操作变量是不安全的?

可防止空指针异常等问题。读写属性下可以做更多的验证操作。

作者: 明靓    时间: 2023-12-26 19:09
hs999xl 发表于 2023-12-26 19:00
想请教下,不安全的写是什么?如何操作变量是不安全的?

写:小鸟没有做房子,把窝搭在树丫上,没有锁门,然后在里面下了三个小鸟蛋,有一天,杜鹃鸟看小鸟妈妈不在偷偷地在里面下了个杜鹃鸟蛋,然后就飞走了,小鸟妈妈莫名其妙地就帮杜鹃鸟养它的孩子.

读:鸟窝露天在外面,有一天窝里来了条蛇,把蛋吃了.

怎样?有何感想?


作者: hs999xl    时间: 2023-12-26 19:11
创世魂 发表于 2023-12-26 19:03
可防止空指针异常等问题。读写属性下可以做更多的验证操作。

“读写属性下可以做更多的验证操作”是不是指“在属性读、写方法里写一些代码保证数据没问题再返回或赋值?”
作者: hs999xl    时间: 2023-12-26 19:16
明靓 发表于 2023-12-26 19:09
写:小鸟没有做房子,把窝搭在树丫上,没有锁门,然后在里面下了三个小鸟蛋,有一天,杜鹃鸟看小鸟妈妈不在偷偷 ...

应该搭个房子保证自己财产安全,还得有安保,不能谁都能进。哈哈
作者: 715684    时间: 2023-12-26 19:54
同问   
作者: 明靓    时间: 2023-12-26 21:24
hs999xl 发表于 2023-12-26 19:16
应该搭个房子保证自己财产安全,还得有安保,不能谁都能进。哈哈

对了,这就是属性写和属性读的作用
作者: urenai    时间: 2023-12-26 22:09
读属性、写属性以及直接操作类变量的区别如下:

读属性:获取类的成员变量值。
写属性:设置类的成员变量值。
直接操作类变量:直接对类变量进行操作,包括赋值、修改等。
三者区别如下:

读属性:通过getter方法获取类的成员变量值,不会对成员变量造成影响。
写属性:通过setter方法设置类的成员变量值,不会对成员变量造成影响。
直接操作类变量:直接对类变量进行操作,可能会对类的状态造成影响。
作者: urenai    时间: 2023-12-26 22:15
读属性和写属性在C#等面向对象编程语言中是指属性的访问器(accessors):

1. **读属性(getter)**:它允许外部代码获取属性的值,但不允许直接修改。当你只想让其他对象读取一个变量的值,而不希望它们直接修改这个值时,你会声明一个只读属性。

```csharp
public string Name { get; private set; }
```
在这个例子中,`Name`是一个读/写属性,但它的设置器(setter)是私有的,所以外部代码只能读取,不能直接写入。

2. **写属性(setter)**:它允许外部代码设置属性的值。当你希望其他对象能够修改一个变量的值时,你会声明一个可写的属性。

```csharp
public int Age { get; set; }
```
在这个例子中,`Age`是一个读/写属性,外部代码可以读取和修改其值。

3. **直接操作类变量(字段或实例变量)**:不通过属性访问器,而是直接访问和修改类内部的变量。这种方式提供了最大的灵活性,但也可能降低代码的封装性和安全性。

```csharp
private string _name;
public string Name {
    get { return _name; }
    set { _name = value; }
}
```
在这个例子中,`_name`是直接操作的类变量,而`Name`是用于封装 `_name` 的一个属性。

区别在于:

- **封装性**:属性提供了对类内部状态(变量)的封装,可以通过 getter 和 setter 控制对这些状态的访问。直接操作类变量则没有这种级别的控制,任何具有访问权限的代码都可以直接修改变量。

- **一致性**:通过属性,可以在获取或设置值时执行额外的操作,如验证、转换或触发事件。直接操作类变量则不会自动执行这些额外操作。

- **可维护性**:如果以后需要改变类的实现细节(如添加验证逻辑或改变存储方式),使用属性的话只需修改属性的 getter 和 setter,而直接操作类变量的代码可能需要在多个地方进行修改。

因此,通常建议使用属性来公开类的内部状态,而不是直接暴露类变量,以提高代码的封装性、一致性和可维护性。
作者: urenai    时间: 2023-12-26 22:16
说白了,1/权限问题,2/高代码的封装性、一致性和可维护性。
作者: hs999xl    时间: 2023-12-26 23:18
urenai 发表于 2023-12-26 22:15
读属性和写属性在C#等面向对象编程语言中是指属性的访问器(accessors):

1. **读属性(getter)**:它 ...

真专业!




欢迎光临 递归火山软件开发平台 (https://bbs.voldp.com/) Powered by Discuz! X3.4