c#是声明两个参数的更好方法

时间:2013-07-24 16:14:21

标签: c# optimization coding-style

关于使用两个变量的最佳方法,我有一个非常快速的问题。基本上我有一个枚举和一个int,我希望在几个ifs中得到的值。我应该在if或者inside之外声明它们 - 请考虑以下示例:

e.g.a:

public void test() {
    EnumName? value = null;
    int distance = 0;

     if(anotherValue == something) {
        distance = 10;
        value = getValue(distance);
     }
     else if(anotherValue == somethingElse) {
        distance = 20;
        value = getValue(distance);
     }


    if (value == theValueWeWant){
      //Do something
 }

OR

e.g.2

public void test() {

     if(anotherValue == something) {
        int distance = 10;
        EnumType value = getValue(distance);
        if (value == theValueWeWant){
           //Do something
     }
     else if(anotherValue == somethingElse) {
        int distance = 20;
        EnumType value = getValue(distance);
        if (value == theValueWeWant){
            //Do something
     }

 }

我只是好奇哪个最好?或者如果有更好的方法?

4 个答案:

答案 0 :(得分:3)

纯粹在维护方面,第一个代码块更好,因为它不重复代码(假设两种情况下“做某事”是相同的)。

就性能而言,差异应该可以忽略不计。第二种情况确实在编译的IL中产生了两倍的本地数,但是JIT应该注意到它们的使用不重叠并优化它们。第二种情况也会导致相同代码发射两次(if (value == theValueWeWant) { ...),但这也不应导致任何显着的性能损失。

(虽然第二个例子的两个方面导致编译的程序集略大,但更多的IL并不总是意味着更差的性能。)

答案 1 :(得分:1)

两个例子都做了两件事:

如果获得所需的值,版本1将运行相同的代码,即使您获得所需的值,版本2也可能运行不同的代码。

你可以做很多可能的(微观)优化。

例如,如果距离仅用于getValue(距离),则可以完全摆脱它:

 /*Waring, micro-optimization!*/
 public void test() {

      EnumType value = getValue((anotherValue == something) ? 10 : (anotherValue == somethingElse) ? 20 : 0);
      if (value == theValueWeWant){
  //Do something
      }
 }

答案 2 :(得分:0)

如果您希望稍后使用它们,那么g代表第二种方法。一旦这些变量超出范围,它们就会丢失。

即使您以后不想使用它们,也应该在if之前声明它们,以避免代码重复。

答案 3 :(得分:0)

这个问题纯粹是风格问题,因此没有正确答案,只有意见

C#最佳实践通常是在使用它们的范围内声明变量。这将指出第二个例子作为答案。即使类型和名称相同,它们也代表不同的用途,应该限制在创建它们的块中。