C# 维护对结构的引用或以其他方式重构此代码?
我有以下代码:C# 维护对结构的引用或以其他方式重构此代码?,c#,reference,refactoring,C#,Reference,Refactoring,我有以下代码: BigInteger lhs = new BigInteger(0); BigInteger rhs = new BigInteger(0); bool isLeftHandSide = true; for (int i = 0; i < txtResult.Text.Length; i++) { char currentCharacter = txtResult.Text[i]; if (char.IsNumber(currentCharacter)
BigInteger lhs = new BigInteger(0);
BigInteger rhs = new BigInteger(0);
bool isLeftHandSide = true;
for (int i = 0; i < txtResult.Text.Length; i++)
{
char currentCharacter = txtResult.Text[i];
if (char.IsNumber(currentCharacter))
{
char currentCharacter = txtResult.Text[i];
if (isLeftHandSide)
{
lhs += (int)char.GetNumericValue(currentCharacter);
}
else
{
rhs += (int)char.GetNumericValue(currentCharacter);
}
}
}
为此:
currentSide += (int)char.GetNumericValue(currentCharacter);
其中currentSide是对lhs或rhs的引用。因为它们是结构,我不知道如何保持对它的引用,而不仅仅是复制数据
谢谢。如果,您不能完全移除
,但您可以将其从循环中拉出:
bool isLeftHandSide = true;
if (isLeftHandSide)
lhs = NewMethod(lhs, txtResult.Text);
else
rhs = NewMethod(rhs, txtResult.Text);
如果
,则不能完全删除,但可以将其从循环中拉出:
bool isLeftHandSide = true;
if (isLeftHandSide)
lhs = NewMethod(lhs, txtResult.Text);
else
rhs = NewMethod(rhs, txtResult.Text);
您可以在lambda中捕获所需的变量,如下所示:
Action<int> addToCurrentSide;
BigInteger lhs = new BigInteger(0);
BigInteger rhs = new BigInteger(0);
addToCurrentSide = x => lhs += x;
for (int i = 0; i < txtResult.Text.Length; i++)
{
char currentCharacter = txtResult.Text[i];
if (char.IsNumber(currentCharacter))
{
char currentCharacter = txtResult.Text[i];
addToCurrentSide((int)char.GetNumericValue(currentCharacter));
}
}
您可以在lambda中捕获所需的变量,如下所示:
Action<int> addToCurrentSide;
BigInteger lhs = new BigInteger(0);
BigInteger rhs = new BigInteger(0);
addToCurrentSide = x => lhs += x;
for (int i = 0; i < txtResult.Text.Length; i++)
{
char currentCharacter = txtResult.Text[i];
if (char.IsNumber(currentCharacter))
{
char currentCharacter = txtResult.Text[i];
addToCurrentSide((int)char.GetNumericValue(currentCharacter));
}
}
你可以这样做
var isLeftHandSide = true;
var currentSide = new BigInteger(0);
for (int i = 0; i < txtResult.Text.Length; i++)
{
char currentCharacter = txtResult.Text[i];
if (char.IsNumber(currentCharacter))
currentSide += (int)char.GetNumericValue(currentCharacter);
}
if (isLeftHandSide)
// lhs = currentSide;
else
// rhs = currentSide;
var isLeftHandSide=true;
var currentSide=新的大整数(0);
for(int i=0;i
你可以这样做
var isLeftHandSide = true;
var currentSide = new BigInteger(0);
for (int i = 0; i < txtResult.Text.Length; i++)
{
char currentCharacter = txtResult.Text[i];
if (char.IsNumber(currentCharacter))
currentSide += (int)char.GetNumericValue(currentCharacter);
}
if (isLeftHandSide)
// lhs = currentSide;
else
// rhs = currentSide;
var isLeftHandSide=true;
var currentSide=新的大整数(0);
for(int i=0;i
您只需要一个包装器类来添加额外的间接层。(我发现这个类有时很有用,我把它作为一个实用类保留下来。)
公共类包装器
{
公共T值{get;set;}
}
然后使用它:
BigInteger lhs = new BigInteger(0);
BigInteger rhs = new BigInteger(0);
Wrapper<BigInteger> currentSide = new Wrapper<BigInteger>();
currentSide.Value = lhs;
for (int i = 0; i < txtResult.Text.Length; i++)
{
char currentCharacter = txtResult.Text[i];
if (char.IsNumber(currentCharacter))
{
currentSide.Value += (int)char.GetNumericValue(currentCharacter);
}
}
BigInteger lhs=新的BigInteger(0);
BigInteger rhs=新的BigInteger(0);
Wrapper currentSide=new Wrapper();
currentSide.Value=lhs;
for(int i=0;i
您只需要一个包装器类来添加额外的间接层。(我发现这个类有时很有用,我把它作为一个实用类保留下来。)
公共类包装器
{
公共T值{get;set;}
}
然后使用它:
BigInteger lhs = new BigInteger(0);
BigInteger rhs = new BigInteger(0);
Wrapper<BigInteger> currentSide = new Wrapper<BigInteger>();
currentSide.Value = lhs;
for (int i = 0; i < txtResult.Text.Length; i++)
{
char currentCharacter = txtResult.Text[i];
if (char.IsNumber(currentCharacter))
{
currentSide.Value += (int)char.GetNumericValue(currentCharacter);
}
}
BigInteger lhs=新的BigInteger(0);
BigInteger rhs=新的BigInteger(0);
Wrapper currentSide=new Wrapper();
currentSide.Value=lhs;
for(int i=0;i
您必须为方法和循环添加上下文。能否为代码片段添加更多上下文?添加更多上下文。您的问题仍然不清楚。您尝试存储哪种类型的对象引用?尝试存储对biginger
的引用。我想一个可能的解决方案是将其包装在容器类中,并将其公开以摆脱if语句。您必须为方法和循环添加上下文。您能为代码片段添加更多上下文吗?添加更多上下文。您的问题仍然不清楚。您尝试存储哪种类型的对象引用?尝试存储对biginger
的引用。我想一个可能的解决方案是将其包装在一个容器类中,并将其公开以消除if语句。请看我的答案。@AndrewCooper您只删除了if
,因为布尔值被硬编码为true
。如果直到运行时才知道,则需要相同的If
语句。通过同样的推理,亨克的重构可以删除if
和硬编码lhs
而不是rhs
,如果他愿意的话。你可以去掉if
。请看我的答案。@AndrewCooper您只删除了if
,因为布尔值被硬编码为true
。如果直到运行时才知道,则需要相同的If
语句。通过同样的推理,亨克的重构可以删除if
和硬编码lhs
的使用,而不是rhs
,就像他想要的那样。如果if
仍然存在,你只需在文本中描述它<代码>addToCurrentSide=isLeftHandSide?x=>lhs+=x:x=>rhs+=x
如果仍然存在,您只需在文本中描述它<代码>addToCurrentSide=isLeftHandSide?x=>lhs+=x:x=>rhs+=x代码>是。我觉得这个比兰姆达更直接。是的。我觉得这个比兰姆达更直接。