gpt4 book ai didi

c# - 当 .NET 反射器显示它已在 .NET Framework 中完成时,为什么我不能将属性或索引器作为 ref 参数传递?

转载 作者:可可西里 更新时间:2023-11-01 08:19:30 25 4
gpt4 key购买 nike

好的,我将从 .NET 反射器中剪切和粘贴以演示我正在尝试做的事情:

public override void UpdateUser(MembershipUser user)
{
//A bunch of irrelevant code...

SecUtility.CheckParameter(ref user.UserName, true, true, true, 0x100, "UserName");

//More irrelevant code...
}

这行代码直接来自 .NET Framework 中的 System.Web.Security.SqlMembershipProvider.UpdateUser (System.Web.dll v2.0.50727)。

SecUtility.CheckParameter 需要一个引用值作为第一个参数,它们将作为参数传入的用户属性传递给该参数。

CheckParameter代码的定义是:

internal static void CheckParameter(ref string param, bool checkForNull, bool checkIfEmpty, bool checkForCommas, int maxSize, string paramName)
{
//Code omitted for brevity
}

它所做的一切都是有道理的 - 在纸面上......所以我为我想使用类似东西的地方敲了一个快速的小原型(prototype):

public class DummyClass
{
public string ClassName{ get; set; }
}

public class Program
{
private static DoSomething(ref string value)
{
//Do something with the value passed in
}

public static Main(string[] args)
{
DummyClass x = new DummyClass() { ClassName = "Hello World" };

DoSomething(ref x.ClassName); //This line has a red squiggly underline
//under x.ClassName indicating the
//error provided below.
}
}

此代码无法编译 - 错误显示为:

"A property or indexer may not be passed as an out or ref parameter"

很公平...但为什么我的代码不允许我执行一些似乎在 .NET Framework 代码库中的操作?这是 .NET Reflector 解释 DLL 的方式错误还是我解释他们的代码的方式错误?

最佳答案

我认为这是 Reflector 的一些错误解释。实际上,如果您这样编写代码:

static void Main(string[] args)
{
DummyClass x = new DummyClass();
string username = x.ClassName;
DoSomething(ref username);
}

并在 Release 模式下编译它,您将在 Reflector 中看到:

static void Main(string[] args)
{
DummyClass x = new DummyClass();
DoSomething(ref x.ClassName);
}

请记住,C# 编译器生成的不是 C# 代码而是 IL,因此您在 Reflector 中看到的并不总是真实的。因此,为了清楚地了解幕后发生的事情,您可以查看编译器生成的真实代码:

L_000f: callvirt instance string System.Web.Security.MembershipUser::get_UserName()
L_0014: stloc.0
L_0015: ldloca.s str
L_0017: ldc.i4.1
L_0018: ldc.i4.1
L_0019: ldc.i4.1
L_001a: ldc.i4 0x100
L_001f: ldstr "UserName"
L_0024: call void System.Web.Util.SecUtility::CheckParameter(string&, bool, bool, bool, int32, string)

很明显,使用了一个局部变量。

关于c# - 当 .NET 反射器显示它已在 .NET Framework 中完成时,为什么我不能将属性或索引器作为 ref 参数传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1810785/

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