可以从C#中的定义函数内部访问变量名吗?
如果我有一个变量,我可以在C#中打印它声明的名称,如下所示:可以从C#中的定义函数内部访问变量名吗?,c#,C#,如果我有一个变量,我可以在C#中打印它声明的名称,如下所示: 我需要在f中放入什么代码来恢复变量名?这可能吗?我想它比前一个要复杂一点。nameof存在,让我们用它来代替 String myVar = "This is a string."; Console.WriteLine($"This variable is named {nameof(myVar)}."); 下一步,我们要做一些改变。我假设,因为您正在传递args,所以这是在Main方法中调用的。我们需要使myVar成为类级变量 st
我需要在
f
中放入什么代码来恢复变量名?这可能吗?我想它比前一个要复杂一点。nameof
存在,让我们用它来代替
String myVar = "This is a string.";
Console.WriteLine($"This variable is named {nameof(myVar)}.");
下一步,我们要做一些改变。我假设,因为您正在传递args
,所以这是在Main
方法中调用的。我们需要使myVar
成为类级变量
static String myVar;
static void Main(string[] args)
{
myVar = f(args);
}
public static String f(string[] args) {
String name = nameof(myVar);
// Whatever else you're doing
}
这有点老套,依赖于您只将此函数的结果分配给函数外部存在的特定变量,这肯定违反了OOP原则,是一种明确的反模式。有了关于您的用例的更多信息,我们可能会引导您找到更好的解决方案
这可能吗
不需要。首先,方法返回的值根本不需要分配给变量。第二,即使它被分配给一个变量,也不是所有变量都有名称。因此,无法知道函数调用值将分配给的变量的名称
最佳实践是始终设计函数,以便它们独立于调用方的细节计算值
(可以从被调用方获取调用方的源代码位置,但该功能应限于调试和诊断目的。)
这听起来很像一个“XY”问题。也就是说,你有一些真正的问题,你对这个问题提出了一个错误的解决方案,现在你问了一个关于错误解决方案的问题。您试图解决的真正问题是什么?您是在询问
nameof(myVar)
?因此,您是在问,如果我是一个函数,我可以获得变量的名称吗?我的完成结果将分配给该变量?请提供示例输入和预期输出。您在f
中的注释令人困惑,因为myVar
是从f
的结果中分配的变量的名称,并且没有被传递到f
。没有args
是对数据(字符串值)的引用,它不知道函数外还有什么其他引用指向相同的数据。奇怪的是,你在这里使用如此复杂的构造来获取变量名,而不是使用nameof。你能说说你为什么做出这个选择吗?嗨,埃里克,你为什么说这根本不可能?我不是专家。因此,我想知道您的想法,因为方法调用不需要分配给变量,即使是,变量也可能没有名称。由于变量名可能不存在,因此无法可靠地获取变量名。“变量名可能不存在”是否指将字符串值传递给GetIdentifier(“Hello”)
?在我的example@Clint:考虑:M()代码>返回被丢弃,因此没有可分配的变量。考虑:N(M())代码>--分配给的变量是N()
的形式参数。考虑<代码> p(PARAMS对象[]x)和<代码> p(m())< /代码>。分配给的变量是x[0]
--x[0]
的名称是什么?考虑<代码> a <代码>返回数组,<代码> x< /Cord>返回索引;代码>A()[X()]=M()代码>指定给的变量的名称是什么?怎么样*((int*)12345678)=M()代码>在不安全代码中;变量的名称是什么?@Clint:假设M
返回一个序列;在foreach(var x in M())
中分配给的变量的名称是什么?它不是x
x
分配给序列的成员,而不是序列。return M()中指定的变量的名称是什么代码>?关于var s=from x in M(),其中x>10选择x.ToString()
s
与M()
返回的序列完全不同,所以不是这样。如果(M().Count()>10)
,分配给那里的变量的名称是什么?有几十种方法可以使调用永远不会分配给变量。
String myVar = "This is a string.";
Console.WriteLine($"This variable is named {nameof(myVar)}.");
static String myVar;
static void Main(string[] args)
{
myVar = f(args);
}
public static String f(string[] args) {
String name = nameof(myVar);
// Whatever else you're doing
}