gpt4 book ai didi

c# - 使 ToUpper 成为 Char 上的静态方法的设计原因

转载 作者:IT王子 更新时间:2023-10-29 04:51:13 26 4
gpt4 key购买 nike

在 C# 中,我们在字符串类型上有这个非静态方法:

"abc".ToUpper()

但是对于char,我们需要使用静态方法:

char.ToUpper('a')

在向初学者介绍c#时,他们总是期望能够写出如下内容:

'a'.ToUpper()

有人知道为什么要这样设计吗?

我唯一能想到的是性能,但我希望类型字符串也有静态 ToUpper()。

最佳答案

区别在于stringreference type。 , char 是代表 .Net Framework 的 Char Structure 的关键字。 .当您调用 Char.ToUpper('a') 时,您实际上是在使用 C# 中的 Char 结构。结构是 Value Types .值类型是不可变的。

由于结构是不可变的,因此作用于结构本身的方法无法按预期工作 (see Why are Mutable Structs Evil)。因此需要静态方法。当调用 Char.ToUpper(aChar) 时,您实际上并没有更改 aChar,而是创建了一个字符的新实例,它是您作为参数传入并返回的字符的大写表示.下面的示例演示了这一点。

Char aChar = 'a';
Char.ToUpper(aChar);
//aChar still equals 'a'

Char bChar = 'b';
bChar = Char.ToUpper(bChar);
//bChar now equals 'B'

char 有其他方法允许您执行类似 'a'.Equals('a'); 的原因是因为值类型和引用类型都继承自 Object ,它定义了那些方法(从技术上讲,值类型是 System.ValueType 类型,它继承自 System.Object)。这些方法不会对对象本身进行任何更改。

编辑 - 为什么这个问题实际上是猜测

因为我很好奇是否有关于“为什么 char 没有 .ToUpper() 方法”的实际答案,我决定检查一下出CSharp 5 Language Specification Document ,我发现了以下内容:

char 是一种整体类型(第 80 页),它是简单类型的子集。简单类型本身只是预定义的结构类型。结构类型是“可以声明常量、字段、方法、属性、索引器、运算符、实例构造函数、静态构造函数和嵌套类型”的值类型(第 79 页)。

string 是一种类类型,它是一种引用类型(第 85 页)。类类型定义“包含数据成员(常量和字段)、函数成员(方法、属性、事件、索引器、运算符、实例构造函数、析构函数和静态构造函数)和嵌套类型的数据结构” (第 84 页)。

此时,很明显 chars 可以支持 .ToUpper() 方法(这就是扩展方法起作用的原因)。但是,正如问题所述,他们不支持一个。 在这一点上,我确信关于为什么这是真的任何推理都纯粹是猜测(当然,除非你在 C# 团队中)。

关于c# - 使 ToUpper 成为 Char 上的静态方法的设计原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38548843/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com