避免两次编码,一次进入条件条件,一次进入分配-C#

时间:2019-01-02 05:54:08

标签: c#

这是我的示例代码:

if (_Timing != target.Split(':')[0] + ": ")
   _Timing = target.Split(':')[0] + ": ";

我检查_Timing是否不等于target.Split(':')[0] + ": ",然后将其关联到_Timing。我两次执行了此target.Split(':')[0] + ": "。我需要避免它。

另一个例子是

if (db.Students.FirstOrDefault(x => x.Name == "Joe") != null)
   var a = db.Students.FirstOrDefault(x => x.Name == "Joe");

在这里,我再次执行db.Students.FirstOrDefault(x => x.Name == "Joe")两次。这些示例只是一些示例。我需要避免像这样的两次编码。

由于收到答案,我可以这样做:

var splitted= target.Split(':')[0] + ": ";
if (_Timing != splitted)
   _Timing = splitted;

但是我不想做这样的事情,因为splitted将保留在内存中。我正在寻找一种不将这些临时数据保存到内存中的方法。

有什么建议吗?

3 个答案:

答案 0 :(得分:4)

您可以将可重用语句保存在变量中,并在流程控制中需要进一步使用的地方重用:

var splitted= target.Split(':')[0] + ": ";
if (_Timing != splitted)
   _Timing = splitted;

linq查询也是如此:

var student = db.Students.FirstOrDefault(x => x.Name == "Joe");
if (student  != null)
{
  // do something here with student
}

如果要避免编写linq查询,则也可以介绍方法:

public Student GetStudentByName(string name)
{
   return db.Students.FirstOrDefault(x => x.Name == "Joe");
}

并重新使用它:

var student = GetStudentByName("Joe");
if (student  != null)
{
  // do something here with student
}

答案 1 :(得分:1)

根据您的要求您说

由于收到答案,我可以这样做:

var splitted= target.Split(':')[0] + ": ";
if (_Timing != splitted)
   _Timing = splitted;

但是我不想做这样的事情,因为拆分将保留在内存中。我正在寻找一种不将该临时数据保存到内存中的方法。 有什么建议吗?

是的,有一种从内存中显式删除变量的方法。

您可以尝试这样做以实现相同的目的,并且变量splitted不再保留在内存中:

var splitted= target.Split(':')[0] + ": ";
if (_Timing != splitted)
{
   _Timing = splitted;
   splitted = null;
   GC.Collect(); // It this stage the 'splitted' is not longer remain in the memory.
}

答案 2 :(得分:0)

删除if块。

  _Timing = target.Split(':')[0] + ": ";

将分配移出if块

var student = db.Students.FirstOrDefault(x => x.Name == "Joe");
if (student  != null)
{
  // 
}