C# 可变重用和效率

C# 可变重用和效率,c#,performance,variables,C#,Performance,Variables,我正在通过一个文本文件进行解析,我所做的很多工作都涉及如下代码: int jobTypeStart = contents.IndexOf("JobType: "); int jobTypeEnd = contents.IndexOf("\r\n", jobtypeStart); string jobType = contents.Substring(jobtypeStart, (jobTypeEnd - jobTypeStart )).Replace("JobType: ","");

我正在通过一个文本文件进行解析,我所做的很多工作都涉及如下代码:

int jobTypeStart = contents.IndexOf("JobType: ");
int jobTypeEnd = contents.IndexOf("\r\n", jobtypeStart);
string jobType = contents.Substring(jobtypeStart, 
    (jobTypeEnd - jobTypeStart )).Replace("JobType: ","");
相同的基本模式在每个文件中重复30次,成百上千个文件在foreach循环中。是每次声明一个新变量更有效,还是重用那些int变量并只更改我要查找的IndexOf更有效?因此,为了清楚起见,我的下一段代码应该是:

int userNameStart = contents.IndexOf("UserName: ");
int userNameEnd = contents.IndexOf("\r\n", userNameStart);
string userName= contents.Substring(userNameStart, 
    (userNameEnd - userNameStart)).Replace("UserName: ","");
或者整个事情应该更像:

int stringStart = contents.IndexOf("JobType: ");
int stringEnd = contents.IndexOf("\r\n", stringStart);
string jobType = contents.Substring(stringStart , 
    (stringEnd  - stringStart)).Replace("JobType: ","");

stringStart = contents.IndexOf("UserName: ");
stringEnd = contents.IndexOf("\r\n", stringStart);
string userName= contents.Substring(stringStart , 
    (stringEnd  - stringStart)).Replace("UserName: ","");
还是我把一些其实并不重要的事情过度复杂化了


干杯。

您最初的方式很好。int和string是声明中的值类型,据我所知,每次进行另一个循环迭代时,它们都会从堆中被拉出

您最初的方式很好。int和string是声明中的值类型,据我所知,每次进行另一个循环迭代时,它们都会从堆中被拉出

您应该将其重构为一个方法:

private string Extract(string text, string field)
{
    int stringStart = text.IndexOf(field);
    int stringEnd = text.IndexOf("\r\n", stringStart);
    return text.Substring(stringStart , (stringEnd  - stringStart)).Replace(field,"");
}
就这样说吧

string userName = Extract(contents, "UserName :");

在这种情况下,我倾向于可读性。

您应该将其重构为一种方法:

private string Extract(string text, string field)
{
    int stringStart = text.IndexOf(field);
    int stringEnd = text.IndexOf("\r\n", stringStart);
    return text.Substring(stringStart , (stringEnd  - stringStart)).Replace(field,"");
}
就这样说吧

string userName = Extract(contents, "UserName :");

在这种情况下,我倾向于可读性。

查看您的代码,我可以看到一种模式。为什么不把所有变量(JobType、UserName…)都放到一个列表中,然后对它们进行迭代以获得字符串。

查看您的代码,我可以看到一个模式。为什么不把所有变量(JobType、UserName…)放入一个列表中,并对它们进行迭代以获得字符串。

也许有一种方法可以帮上忙

 private string DoStuff(string contents, string matchString)
 {
     int stringStart = contents.IndexOf(matchString + ": ");
     int stringEnd = contents.IndexOf("\r\n", stringStart);
     return contents.Substring(stringStart, (stringEnd - stringStart)).Replace(matchString + ": ", "");
 }
然后每次都叫它:

string jobType = DoStuff(contents, "JobType");
string userName = DoStuff(contents, "UserName");

也许有一种方法能帮上忙

 private string DoStuff(string contents, string matchString)
 {
     int stringStart = contents.IndexOf(matchString + ": ");
     int stringEnd = contents.IndexOf("\r\n", stringStart);
     return contents.Substring(stringStart, (stringEnd - stringStart)).Replace(matchString + ": ", "");
 }
然后每次都叫它:

string jobType = DoStuff(contents, "JobType");
string userName = DoStuff(contents, "UserName");

这真的不重要…您是否有一个真正的性能瓶颈问题,您可以进行测量,并将范围缩小到这段代码?如果没有,你绝对不应该做什么。正如陈词滥调所说,“过早的优化是万恶之源”。@Russell-没有瓶颈,我正在输入代码,想知道这样的思维会怎么想。下面关于重构成一个方法的建议是一个更好的答案。这真的不重要……你是否有一个性能瓶颈,这是一个真正的问题,你可以衡量,你已经缩小到这一点的代码?如果没有,你绝对不应该做什么。正如陈词滥调所说,“过早的优化是万恶之源”。@Russell-没有瓶颈,我正在输入代码,想知道这样的思维会怎么想。下面的重构成方法的建议无论如何都是一个更好的答案。。将
文本
更改为
内容
,它将实际编译;)几乎。。将
文本
更改为
内容
,它将实际编译;)