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);
}