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

本文关键字:设置 变量 返回值 扩展 方法 | 更新日期: 2023-09-27 18:18:01

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

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"写入控制台。我不应该重新赋值这个变量,对吧?

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

我错过了什么吗?

是的-在第一个代码片段中,您没有使用方法的返回值。您所需要做的就是设置返回值,就像在工作用例中所做的那样(第二个代码片段)。更改参数的值没有什么区别,因为它是按值参数。你是否使用了一个扩展方法在这里是无关紧要的。

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

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

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

您可能需要阅读我关于参数传递的文章,以获得更多的背景知识,以及我关于值类型和引用类型的文章。

byte为值类型。testoriginal都是不同的值,修改其中一个不修改另一个

您没有修改函数中的测试值。参数是变量的副本,你改变它的值,然后返回它。如果你想操作变量,那么你应该使用ref修饰符,但扩展方法的第一个参数不能声明为ref