C# 在我的代码中,哪种代码行为更好?如何更改我的代码?

C# 在我的代码中,哪种代码行为更好?如何更改我的代码?,c#,design-patterns,C#,Design Patterns,有一次我读到一本书说在循环中创建对象的效率很低。现在我必须在循环中组合对象。如何改变它以提高效率 我的型号 public class Student { public int Age{ get; set; } public string Name{ get; set; } public string Sid{ get; set; } } 我的圈代码:按sid获取所有学生 var sidArr="1,2,3,4".split(','); List<Student&g

有一次我读到一本书说在循环中创建对象的效率很低。现在我必须在循环中组合对象。如何改变它以提高效率

我的型号

public class Student
{
    public int Age{ get; set; }
    public string Name{ get; set; }
    public string Sid{ get; set; }
}
我的圈代码:按sid获取所有学生

var sidArr="1,2,3,4".split(',');
List<Student> studentes=new List<Student>();
for(int i=sidArr.count();i>=0;i--)
{
  Student student=new Student();
  student.Sid=i;
  var findStudent=student.GetStudentBySid(i);
  if(findStudent!=null)
 {
 student.Name=findStudent.Name;
 student.Age=findStudent.Age;
 }
 studentes.Add(student);
}
var sidArr=“1,2,3,4”。拆分(',');
List studentes=新列表();
对于(int i=sidArr.count();i>=0;i--)
{
学生=新生();
student.Sid=i;
var findStudent=student.getstudentbyId(i);
如果(findStudent!=null)
{
student.Name=findStudent.Name;
student.Age=findStudent.Age;
}
添加(学生);
}

我应该把这个代码放在Student=newstudent()上吗循环外?如果有许多sid来创建许多学生,我应该使用设计模式吗

您可以这样实现它(只是不要在循环中执行不必要的操作:例如,创建新的
Student
实例,如果并且仅当您必须这样做时)

var sidArr=“1,2,3,4”。拆分(',');
List studentes=新列表();
// 1. 计数-1:当可以使用简单属性时,不要使用Linq
// 2. 计数-1:注意范围检查错误
// 3. foreach(sidArr中的int-sid)在这里看起来好多了
对于(int i=sidArr.Count-1;i>=0;--i){
//您应该按sid搜索,而不是按索引i搜索
int-sid=sidArr[i];
var student=student.getStudentById(sid);
如果(学生==null){
//如果找不到student,我们必须创建一个新实例
学生=新学生();
student.Sid=isd;//
我曾经读过一本书,书中说在循环中创建对象的效率很低

你要么错过了上下文,要么那本书是垃圾

如何改变它以提高效率

如果不分析代码,就永远不会谈论效率。在不知道代码在整体上是一个性能问题的情况下,试图提高代码的效率从来都不是一个好主意

您的代码非常简单,任何优化它的尝试都只会增加代码的复杂性,而不会给您带来任何可测量的性能增益

我应该把这个代码
Student=new Student();
放在循环之外吗


不,这将改变代码的含义。

谢谢@Dmitry Bychenko,在我的情况下,似乎我必须在循环中创建对象。你呢?你是否使用原型设计模式来避免创建循环对象?.Net专门设计用于创建和收集许多短期实例;这就是为什么如果你只有4个(或4000个)实例的原因仅限学生-创建它们。如果构造函数耗时,您可能希望避免重新创建-例如,您必须从数据库加载值。
var sidArr = "1,2,3,4".split(',');

List<Student> studentes = new List<Student>();

// 1. Count - 1: do not use Linq when you can use a simple property 
// 2. Count - 1: beware range check errors
// 3. foreach(int sid in sidArr) looks much better here
for(int i = sidArr.Count - 1; i >= 0; --i) {
  // You should seach by sid, not by index i
  int sid = sidArr[i];

  var student = student.GetStudentBySid(sid);

  if (student == null) {
    // If student is not found, we have to create a new instance 
    student = new Student();

    student.Sid = isd; // <- do not forget to set the SID
    student.Name = findStudent.Name;
    student.Age = findStudent.Age;
  } 

  // Add student: either found or created one
  studentes.Add(student);
}