C# 扩展方法返回值不设置变量

标签 c# extension-methods

为什么这个扩展方法不设置它应用的值?

public static byte ExtSetBits(this byte original, byte value, byte bitSize)
{
    unchecked { original &= (byte)~bitSize; }
    original |= (byte)(value & bitSize);
    return original;
}

这是调用 ( selectedIndex = 13 ):

byte test = 0xFF;
test.ExtSetBits(selectedIndex, 0x1F);
Console.WriteLine("test:" + test.ToString("X").PadLeft(2,'0'));

将“test: FF”写入控制台。

如果我这样做,它会起作用:

byte test = 0xFF;
test = test.ExtSetBits(selectedIndex, 0x1F);
Console.WriteLine("test:" + test.ToString("X").PadLeft(2,'0'));

将“test: ED”写入控制台。我不应该重新分配变量吗?我已经编写了许多其他扩展。

最佳答案

Am I missing something?

是的 - 您没有使用第一个代码段中方法的返回值。您所需要的只是设置返回值,就像您在工作案例(您的第二个代码片段)中所做的那样。更改参数 的值没有任何区别,因为它是按值参数。您使用扩展方法这一事实与此无关。

假设您的代码实际上只是:

ExtensionClass.ExtSetBits(test, selectedIndex, 0x1F);

毕竟,这就是编译器将您的代码转换成的目标。如果您忽略它是一个扩展方法这一事实(您应该这样做,因为它与此处无关),您会期望它改变 test 的值吗?为此,您需要通过引用(使用 ref)传递它 - 但不允许扩展方法的第一个参数具有 ref 修饰符。

您可能想阅读 my article about parameter passing更多背景信息,以及 my article about value types and reference types .

关于C# 扩展方法返回值不设置变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25289093/

相关文章:

c# - 用于批量插入具有子对象的对象的性能

c# - 如何从现有列表创建新列表?

F#:SRTP静态扩展方法类型匹配不一致

c# - 如何检查扩展方法中类型中是否存在属性?

c# - 恢复 C# 线程

c# - 具有 [ThreadStatic] 属性的静态变量是否在 AppDomain 之间共享

c# - 为什么非静态类中的静态方法不能成为扩展方法?

ios - Swift:将协议(protocol)的实现类型存储在协议(protocol)扩展的静态变量中

c# - 将数字转换为 IFormattable 无法按预期工作

c# - Enum 的 Count 和 ToList 扩展方法?