Sab*_*baz 11 c# switch-statement
请帮忙,我有这个案子:
switch(MyFoo()){
case 0: //...
break;
case 1: //...
break;
case 2: //...
break;
default:
// <HERE>
break;
}
Run Code Online (Sandbox Code Playgroud)
如您所见,开关直接从方法获取值而不将其保存为变量.
是否有可能获得哪种价值default?例如,如果MyFoo()返回7,我该如何获得该值?
我想避免将方法结果保存为变量,有没有办法从案例中获取开关值?像这样的东西:
default:
this.SwitchValue // <<--
break;
Run Code Online (Sandbox Code Playgroud)
谢谢你的阅读,〜萨巴
Ora*_*ace 12
有没有办法从案例中获取开关值?
唯一(正确)的方法实际上是将结果存储MyFoo()在变量中.
var fooResult = MyFoo();
switch (fooResult)
{
case 0:
...
break;
...
default:
handleOthersCase(fooResult);
break;
}
Run Code Online (Sandbox Code Playgroud)
这段代码是可读和易懂的,没有额外费用(正如@SheldonNeilson所说:无论如何它都在堆栈中).
另外,关于交换机的MSDN第一个例子看起来像这样.您还可以在语言规范中找到信息.
您也可以根据字典创建自己的开关,但我看到的唯一优势是您可以将它用于复杂的情况(任何类型的对象而不是字符串/ int/...).性能是一个缺点.
它可能看起来像这样:
public class MySwitch<T> : Dictionary<T, Action<T>>
{
private Action<T> _defaultAction;
public void TryInvoke(T value)
{
Action<T> action;
if (TryGetValue(value, out action))
{
action(value);
}
else
{
var defaultAction = _defaultAction;
if (defaultAction != null)
{
defaultAction(value);
}
}
}
public void SetDefault(Action<T> defaultAction)
{
_defaultAction = defaultAction;
}
}
Run Code Online (Sandbox Code Playgroud)
并像这样使用:
var mySwitch = new MySwitch<int>();
mySwitch.Add(1, i => Console.WriteLine("one")); // print "one"
mySwitch.Add(2, i => Console.WriteLine("two")); // print "two"
mySwitch.SetDefault(i => Console.WriteLine("With the digits: {0}", i)); // print any other value with digits.
mySwitch.TryInvoke(42); // Output: "With the digits: 42"
Run Code Online (Sandbox Code Playgroud)
或者根据这个回答,这个:
public class MySwitch2<T>
{
private readonly T _input;
private bool _done = false;
private MySwitch2(T input)
{
_input = input;
}
public MySwitch2<T> On(T input)
{
return new MySwitch2<T>(input);
}
public MySwitch2<T> Case(T caseValue, Action<T> action)
{
if (!_done && Equals(_input, caseValue))
{
_done = true;
action(_input);
}
return this;
}
public void Default(Action<T> action)
{
if (!_done)
{
action(_input);
}
}
}
Run Code Online (Sandbox Code Playgroud)
可以这样使用:
MySwitch2<int>.On(42)
.Case(1, i => Console.WriteLine("one"))
.Case(2, i => Console.WriteLine("two"))
.Default(i => Console.WriteLine("With the digits: {0}", i));
Run Code Online (Sandbox Code Playgroud)
我不明白为什么要这样使用它,但可能是一个解决方案将是这样的:
int x;
switch ( x = MyFoo())
{
case 0: //...
break;
case 1: //...
break;
case 2: //...
break;
default:
var s = x; // Access and play with x here
break;
}
Run Code Online (Sandbox Code Playgroud)