首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >类的属性是否从任何地方都是不可改变的,以便它在C#中是不可变的?

类的属性是否从任何地方都是不可改变的,以便它在C#中是不可变的?
EN

Stack Overflow用户
提问于 2016-06-19 01:10:10
回答 2查看 72关注 0票数 0

考虑一下这门课:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Point
{
    private int x { get; private set; }
    private int y { get; private set; }

    public Point(int x, int y)
    {
        this.x = x;
        this.y = y;
    }

    public void ChangePoint(int x, int y)
    {
        this.x = x;
        this.y = y;
    }
}

这个类被认为是不可变的吗?换句话说,如果一个类是不可变的,那么它的属性是在任何地方都是不可改变的,还是只在类之外?

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-19 01:15:42

您可以说,基于以下类创建的对象是immutable,因为没有任何方法更改x and y。它们只设置在对象的构造中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Point
{
    public int X { get; private set; }
    public int Y { get; private set; }

    public Point(int x, int y)
    {
        X = x;
        Y = y;
    }
}

尽管如此,以下声明如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var point = new Point(3,4);

创建一个行为像不可变对象的对象。我们必须指出,C#没有固有的不可变的数据结构。不可变的数据结构在LISP、Haskell等功能语言中很常见。

是的,但是我的类是否称为不可变,因为它们不是仅在构造函数中设置的?

不,如果添加方法ChangePoint,则不能讨论不可变的数据结构。因为您修改了所创建的对象,所以您更改了它的状态。

理解不变性概念的一个更好的方法是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var numbers = new List<int>();
numbers.Add(1);
numbers.Add(2);

创建一个列表,然后添加1和2。这样,每次添加新项时,都会更改相同列表的状态。(出于简化的原因,我们没有考虑到列表已经满足其容量的情况,并且应该创建另一个双大小数组,在那里复制元素并添加新项。)

另一方面,假设在Haskel中有以下列表:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[1,2,3]

然后当您将添加另一个元素时

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[1,2,3]++[4]

将创建并返回一个新列表,即1、2、3、4。每次向列表中添加一个新项时,都会创建一个新对象,该对象包含初始列表的元素和新添加的元素。

但是,有一个库为您提供了在C#中使用不可变集合的机会。

票数 1
EN

Stack Overflow用户

发布于 2016-06-19 01:13:52

实际上,由于C#没有除不变集合以外的不可变类型,所以我将应用以下规则:

引用类型是可变的,除非它的所有属性都不会超过对象的构造时间,并且它的数据公开为只读属性或字段,或者常量

...or:

引用类型是不可变的,除非其属性或字段可以在构造时间之后更改。

顺便说一句,不变集合遵循上述规则:不变性不是使用C#语法强制执行的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37905621

复制
相关文章
Java8 - Streams flatMap()
在 Java 8 中,我们可以使用 flatMap 将上述 2 级 Stream 转换为一级 Stream 或将 二维数组转换为 一维数组。
小小工匠
2023/01/03
1.6K0
Java8 - Streams flatMap()
Java8——行为参数化传递代码
1、初试牛刀:筛选绿苹果 第一个解决方案可能是下面这样的: public static List<Apple> filterGreenApples(List<Apple> inventory){ List<Apple> result=new ArrayList<>(); //仅仅筛选出绿苹果 for (Apple apple : inventory) { if ("green".equals(apple.getColor())){
AlbertZhang
2020/09/02
5090
Java 8 Streams map() 示例
在Java 8中stream().map(),您可以将对象转换为其他对象。查看以下示例:
三产
2021/01/12
6880
Java8 - Streams map()
Stream.map()是Stream最常用的一个转换方法,它把一个Stream转换为另一个Stream
小小工匠
2023/01/01
4540
Java8 - Streams map()
向Bash函数传递参数
除非发生语法错误或已存在同名的只读函数,否则函数定义的退出状态为零。执行时,函数的退出状态码是在主体中执行的最后一个命令的退出状态码。
程序熵
2023/09/25
1940
向Bash函数传递参数
C++函数参数传递
当形参是非引用类型时,实参的值会被拷贝给形参,实参和形参是两个完全不同的对象,函数对形参做的所有操作都不会影响实参。
TOMOCAT
2021/05/11
1.7K0
Python函数参数传递机制
其中Number、String、Tuple和Sets是不可变类型,List和Dictionary是可变类型。
猫叔Rex
2022/01/24
8040
Python 函数作为参数传递
#map()的功能是将函数对象依次作用于表的每一个元素,每次作用的结果储存于返回的表re中。 #map通过读入的函数(这里是lambda函数)来操作数据 def test_func_map():     re = map((lambda x: x+3), [1, 2, 3, 4])     print re def testA(a, b, **kargs):     print a+b     print "testA: %s" % kargs #函数作为参数传递 def test_func(func, a, b, **kargs):     func(a, b)     print "test_func: %s" % kargs #函数作为参数传递 def test_func_lambda(func, **kargs):     func()     print "test_func_lambda: %s" % kargs def test_func_getattr():     func = getattr(obj, "testA")     func(1, 2) class TestGetattr():     aa = "2a"     def get_attr(self):         print "test getattr()"     def print_text(self):         print "print text"     def print_string(self):         print "print string" #getattr(obj, "a")的作用和obj.a是一致的,但该方法还有其他的用处,最方便的就是用来实现工厂方法 #根据传入参数不同,调用不同的函数实现几种格式的输出 def output(print_type="text"):     tg = TestGetattr()     output_func = getattr(tg, "print_%s" % print_type)     output_func() if __name__ == "__main__":     #test_func(testA, 1, 2, aa="aa")     #test_func_lambda((lambda: testA(1, 2, bb="bb")), cc="cc")     #test_func_map()     #test_func_getattr()     #getattr方法,传入参数是对象和该对象的函数或者属性的名字,返回对象的函数或者属性实例     obj = TestGetattr()     func = getattr(obj, "get_attr") #getattr()获得对象的属性和方法     func()     print getattr(obj, "aa") #完成对象的反射     print obj.aa     #callable方法,如果传入的参数是可以调用的函数,则返回true,否则返回false。     print callable(getattr(obj, "aa"))     output("string")
py3study
2020/01/09
3K0
Python函数参数传递机制
        最近在写代码的过程中,发现Python参数传递不是很明白。Python确实很灵活,但是灵活的后果就是要花更多的时间去研究。废话不多说,始めましょう!!!
py3study
2020/01/09
1K0
【Python】函数进阶 ③ ( 函数作为参数传递 )
之前介绍的函数 , 都是 接收具体的 变量 或 字面量 数据 作为参数 , 如 : 数字 / 布尔值 / 字典 / 列表 / 元组 等 ;
韩曙亮
2023/10/11
4560
【Python】函数进阶 ③ ( 函数作为参数传递 )
Java 8 中的 Streams API 详解
Stream 作为 Java 8 的一大亮点,它与 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念。它也不同于 StAX 对 XML 解析的 Stream,也不是 Amazon Kinesis 对大数据实时处理的 Stream。Java 8 中的 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利、高效的聚合操作(aggregate operation),或者大批量数据操作 (bulk data operation)。Stream API 借助于同样新出现的 Lambda 表达式,极大的提高编程效率和程序可读性。同时它提供串行和并行两种模式进行汇聚操作,并发模式能够充分利用多核处理器的优势,使用 fork/join 并行方式来拆分任务和加速处理过程。通常编写并行代码很难而且容易出错, 但使用 Stream API 无需编写一行多线程的代码,就可以很方便地写出高性能的并发程序。所以说,Java 8 中首次出现的 java.util.stream 是一个函数式语言+多核时代综合影响的产物。
编程十年
2019/09/17
1.1K0
Golang函数参数的值传递和引用传递
值传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数
仙人技术
2021/08/31
2.5K0
Golang函数参数的值传递和引用传递
Java 参数传递是值传递还是引用传递?
首先把结论表明,Java 的参数传递是值传递,因为有部分细节让人引起误解以为是引用传递,故我们写两个例子来举例探讨。
萬物並作吾以觀復
2019/05/10
2.8K0
java中的参数传递-值传递、引用传递
参数是按值而不是按引用传递的说明 Java 应用程序有且仅有的一种参数传递机制,即按值传递。
chenchenchen
2022/11/29
4.7K0
java中的参数传递-值传递、引用传递
go语言:函数参数传递详解
参数传递是指在程序的传递过程中,实际参数就会将参数值传递给相应的形式参数,然后在函数中实现对数据处理和返回的过程。比较常见的参数传递有:值传递,按地址传递参数或者按数组传递参数。
李海彬
2018/07/26
9050
go语言:函数参数传递详解
python开发_函数的参数传递
在这个用例中,我们要讨论的是关于函数的传参问题 我所使用的python版本为3.3.2
Hongten
2018/09/13
1.1K0
Java的参数传递是值传递还是引用传递
当一个对象被当作参数传递到一个方法后,在此方法内可以改变这个对象的属性,那么这里到底是值传递还是引用传递?    答:是按值传递。Java 语言的参数传递只有按值传递。当一个实例对象作为参数被传递到方
nnngu
2018/03/15
3.3K0
Java的参数传递是值传递还是引用传递
Go-函数作为参数传递
编码过程中业务需要将一个函数,作为参数传递到函数内部。Go 语言的匿名函数是一个闭包(Closure)
王小明_HIT
2023/03/01
1.7K0
Go-函数作为参数传递
scrapy回调函数传递参数
scrapy.Request 的callback传参的两种方式 1.使用 lambda方式传递参数 def parse(self, response): for sel in response.xpath('//li[@class="clearfix"]/div[@class="list_con"]'): item=DmozItem() item['href']=sel.xpath('h2/a/@href').extract()[0] yield sc
用户1558882
2018/04/03
1.2K0
点击加载更多

相似问题

使用Java 8 Streams对集合进行分组和排序

11

带参数的Java 8 streams映射

31

Java Streams中的lambda函数集合

15

如何使用Java 8 streams流式传输带有集合的地图?

246

使用不同集合的Java8- Streams嵌套ForEach

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文