可以从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

如果我有一个变量,我可以在C#中打印它声明的名称,如下所示:


我需要在
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
}