【问题标题】:Does a C# indexer return a variable or value?C# 索引器是否返回变量或值?
【发布时间】:2014-01-04 10:47:43
【问题描述】:

可变结构容易出错;当T 是一个矩形时,dictionary[0].Inflate(1,1) 的行为与array[0].Inflate(1,1) 的行为不同(因为array[0] 是一个变量,而dictionary[0] 是一个)。

如果我为SomeClass 制作自定义索引器:

public T this[int x, int y] { get { return arr[y*100+x]; } }

someclass[x,y]变量 还是 还是两者都不是?假设T 当然是struct

【问题讨论】:

  • 你的意思是值类型和引用类型,而不是值和变量?
  • 看起来你正在混淆 variablereference type
  • @Mr.Smith 我不这么认为。结构始终是值类型。它永远不会有什么不同。变量根本不是类型。
  • @Mr.Smith 来自 MSDN:变量表示存储位置。每个变量都有一个类型,它决定了哪些值可以存储在变量中。
  • @Mr.Smith 好的,有道理,这是我不熟悉的术语选择。

标签: c#


【解决方案1】:

索引器访问表达式最初被归类为“索引器访问”。来自 C# 4 规范的第 7.6.6.2 节:

处理索引器访问的结果是分类为索引器访问的表达式

然后从第 7.1 节开始:

属性访问或索引器访问总是通过调用 get-accessorset-accessor 重新分类为值。

所以基本上你可以认为它被归类为一个值。

但是,数组 访问被归类为变量表达式。来自 C# 4 规范的第 7.6.6.1 节:

评估数组访问的结果是数组元素类型的变量[...]

这就是为什么这很好:

string[] x = { "", "", "" };
SomeMethodWithRef(ref x[0]);

但这不是:

List<string> x = new List<string> { "", "", "" };
SomeMethodWitHRef(ref x[0]);

【讨论】:

  • 只是为了绝对确定我没看错,这是否意味着我的索引器正在返回结构 T副本
  • @Mr.Smith:是的,与简单赋值复制值的方式完全相同。
猜你喜欢
  • 1970-01-01
  • 2021-11-08
  • 2017-05-28
  • 1970-01-01
  • 1970-01-01
  • 2011-05-29
  • 2019-02-13
  • 1970-01-01
  • 2019-03-30
相关资源
最近更新 更多