强制函数返回值并产生编译错误 C#

8

我有一个类和一个方法在这个类里面。然而,这个类方法返回一个字符串。当我调用这个类的方法时,即使我没有捕获字符串值返回,我也不会收到错误。有没有一种方法可以让C#和.NET在返回值时强制我捕获这个值。

以下是一个示例:

1- 创建一个名为test的类。

class test
    {

        public string mystring() {

            return "BLAH";

        }
    }

2- 在程序或另一个类中调用类方法

test mystring = new test();
mystring.mystring();

我在Visual Studio中编写代码时,编译器没有报错提示我没有捕获返回值。这种情况正常吗?还是我漏掉了什么?我能否强制编译器通知我函数返回了一个值但我没有捕获它?

非常感谢您提供的任何建议。


你的意思是强制它执行类似于 string a = mystring.mystring(); 这样的操作吗? - Nyra
这正是我所指的。 - Miguel
1
@Miguel 为什么你想强制调用者对返回值做出处理? - D Stanley
我有点困惑...你没有收到错误是因为你在方法中有返回语句。 - M H
5个回答

9
你可以将这个方法转换为一个属性:
  public string myString
  {
    get
    {
      return "Blah";
    }
  }

如果您仅调用属性,则无法编译:

myString.myString; //Results in "Only assignment, call, increment, decrement, await, and new object expressions can be used as a statement" Error

1
我不明白你的意思,dognose?如果你尝试在这种情况下执行 mystring.mystring;(注意没有(),因为它现在是一个属性而不是方法),那么它将无法编译。 - Nyra
@dognose:编译器无法强制你对返回值进行操作。这属于计算理论范畴。有9件事情是计算机无法完成的。(别让我列举它们,因为距离我上计算机理论课已经20年了。)但可以说编译器无法知道你是否对返回值进行了任何有效的使用。 - DeadZone
但是如果我需要该方法执行一些计算并返回“BLAH”,我还能使用属性吗? - Miguel
是的。属性可以像方法一样在其中执行计算。 - DeadZone
1
@Miguel,简而言之:是的。然而,通常你只想在属性中执行“快速”操作。请参见此处获取更多信息。 - MikeH
2
@Miguel,你也可以让一个属性返回一个方法,所以 string mystring{ get { return test(); }} ..... test(){ return "test";} 调用 mystring 将会给你 "test" 并且你必须使用它。 - Nyra

1
总的来说,不行。不能强制如此。
通常情况下不捕获返回值是很普遍的。核心库中有许多例子(例如向Hashset<T>添加元素,实际上函数会返回一个bool来标识它是否已经被添加或者已经存在 - 根据个人实现我可能会或者不会关心这一点)。
当然,你总是可以像这样每次都执行string str = MyFunction()但从不使用str,但我猜你可能已经知道了。

1
你可以尝试通过右键单击解决方案资源管理器中的项目,点击属性,转到生成选项卡并将将警告视为错误设置为全部来将警告作为错误开启。这将强制你在构建之前解决所有警告,并捕获一些未分配的情况。
编译器无法知道你的方法的唯一目的是返回字符串还是执行会影响状态的工作,因此当你不将结果分配给任何东西时,它无法抱怨。
但是,你可以按照MikeH的答案将其设置为只读属性。这将在你不将其分配给任何东西时发出警告。

0
对于未来遇到此问题的人,你可以使用“out”。这将强制你始终分配变量。
public void mystring(out returnString) {

    returnString = "BLAH";

}

...

string OutString;
test mystring = new test();
mystring.mystring(out OutString);

2
嗯,mystring(out _);仍然可以编译并且不会分配任何东西而丢弃结果。虽然至少是明确的。 - Jon Skeet

0
如果您的函数具有副作用,则应创建未使用的变量并捕获值。编译器在发布选项中会删除此变量。
但是,如果您的函数没有副作用:您可以使用Visual Studio工具,例如“监视窗口”和“立即窗口”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接