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是。我觉得这个比兰姆达更直接。是的。我觉得这个比兰姆达更直接。