为什么在重构到方法时 Visual studio 添加 "ref" 到值类型?
Why is Visual studio adding "ref" to value types when refactoring into methods?
我不明白 Visual Studio Express 2013 在 运行 进行 "Extract Method" 重构时做出的决定。考虑以下代码:
public struct Foo
{
private readonly int x, y;
public int X { get { return x; } }
public int Y { get { return y; } }
public Foo(int x, int y)
{
this.x = x;
this.y = y;
}
}
class Test
{
static void Main()
{
Foo a = new Foo(1, 2);
Foo b = new Foo(3, 4);
Console.WriteLine(a);
Console.WriteLine(a + "" + b);
}
}
如果我突出显示第一个 Console.WriteLine
调用和 运行 Extract Method 重构,提取一个名为 OneParameter
的方法,然后对第二个调用执行相同的操作,提取一个名为 TwoParameters
,我最终得到这个代码:
class Test
{
static void Main()
{
Foo a = new Foo(1, 2);
Foo b = new Foo(3, 4);
OneParameter(a);
TwoParameters(ref a, ref b);
}
static Foo OneParameter(Foo a)
{
Console.WriteLine(a);
return a;
}
static void TwoParameters(ref Foo a, ref Foo b)
{
Console.WriteLine(a + "" + b);
}
}
为什么二参数法有ref
个参数,而单参数法没有?在这里使用 ref
有什么意义?
另外,为什么单参数方法 return Foo?
return 和两个引用都发生在结构可变和修改的情况下。 VS 2013 并没有真正对不可变性的结构类型或变异操作的选定代码进行任何分析。 primitives/Guid/etc 不会发生这种情况,仅仅是因为框架中有一个已知不可变的硬编码值类型列表。
我不明白 Visual Studio Express 2013 在 运行 进行 "Extract Method" 重构时做出的决定。考虑以下代码:
public struct Foo
{
private readonly int x, y;
public int X { get { return x; } }
public int Y { get { return y; } }
public Foo(int x, int y)
{
this.x = x;
this.y = y;
}
}
class Test
{
static void Main()
{
Foo a = new Foo(1, 2);
Foo b = new Foo(3, 4);
Console.WriteLine(a);
Console.WriteLine(a + "" + b);
}
}
如果我突出显示第一个 Console.WriteLine
调用和 运行 Extract Method 重构,提取一个名为 OneParameter
的方法,然后对第二个调用执行相同的操作,提取一个名为 TwoParameters
,我最终得到这个代码:
class Test
{
static void Main()
{
Foo a = new Foo(1, 2);
Foo b = new Foo(3, 4);
OneParameter(a);
TwoParameters(ref a, ref b);
}
static Foo OneParameter(Foo a)
{
Console.WriteLine(a);
return a;
}
static void TwoParameters(ref Foo a, ref Foo b)
{
Console.WriteLine(a + "" + b);
}
}
为什么二参数法有ref
个参数,而单参数法没有?在这里使用 ref
有什么意义?
另外,为什么单参数方法 return Foo?
return 和两个引用都发生在结构可变和修改的情况下。 VS 2013 并没有真正对不可变性的结构类型或变异操作的选定代码进行任何分析。 primitives/Guid/etc 不会发生这种情况,仅仅是因为框架中有一个已知不可变的硬编码值类型列表。