C#中能否不初始化使用var?代码var变量初始值设置咨询
让我来一步步解答你的两个C#问题:
问题1:在C#中是否可以不初始化就使用var关键字声明变量?
当然不行!C#里的var关键字是靠类型推断来确定变量类型的——编译器必须从你给的初始值里“猜”出这个变量的具体类型。如果只写var myVar;不给初始值,编译器会直接懵圈:“你到底让我把这变量当成啥类型啊?”,紧接着就会抛出编译错误。
简单来说:var的本质是让编译器帮你写类型名,但前提是你得给它足够的信息(也就是初始值)来推断类型。所以用var声明变量时,必须同时完成初始化。
问题2:如何为var candidate_MNA设置初始值,以便在try块中重新赋值?
你的代码里用到了匿名类型(select new { ... }),这是问题的关键——匿名类型无法被显式声明,所以直接给candidate_MNA赋值null的话,编译器还是没法推断它的类型,会报错。这里有两种可行的解决方案:
方案1:用匹配结构的匿名类型实例初始化
你可以创建一个和查询结果结构完全一致的匿名类型实例作为初始值,这样编译器就能准确推断出candidate_MNA的类型,后续在try块里重新赋值就没问题了:
// 初始化一个和查询结果结构完全匹配的匿名类型实例 var candidate_MNA = new { candidate_id = 0, // 对应c.candidate_id的类型,比如int就设0 candidate_name = "", // 假设是字符串,设空字符串 party_name = "", // 其他查询中用到的属性都要对应上 // 所有查询返回的匿名属性都要在这里定义默认值 }; try { candidate_MNA = (from c in db.ms_cadidate join h in db.ms_halqa on c.candidate_halqa_id equals h.halqa_id join p in db.ms_party on c.candidate_party_id equals p.party_id where h.halqa_id == SessionWrapper.user.user_halqa_id && c.candidate_type == "1" select new { candidate_id = c.candidate_id, candidate_name = c.candidate_name, party_name = p.party_name // 这里的属性必须和上面初始化的匿名类型完全一致(名称、类型都要匹配) }).FirstOrDefault(); // 假设你要取单个对象,加FirstOrDefault() } catch(Exception ex) { // 异常处理逻辑 }
注意:匿名类型的属性名称和类型必须完全匹配,否则编译器会认为是不同的类型,赋值时会报错。
方案2:定义显式实体类(推荐)
匿名类型虽然方便,但只能在当前方法内使用,而且遇到这种跨作用域赋值的场景会很麻烦。更规范的做法是定义一个专门的实体类来承载查询结果:
// 先定义一个实体类,对应你的查询结果 public class CandidateMNA { public int candidate_id { get; set; } public string candidate_name { get; set; } public string party_name { get; set; } // 其他需要的属性都在这里定义 } // 现在可以直接初始化,类型明确 var candidate_MNA = default(CandidateMNA); // 或者设为null,因为是引用类型 try { candidate_MNA = (from c in db.ms_cadidate join h in db.ms_halqa on c.candidate_halqa_id equals h.halqa_id join p in db.ms_party on c.candidate_party_id equals p.party_id where h.halqa_id == SessionWrapper.user.user_halqa_id && c.candidate_type == "1" select new CandidateMNA { candidate_id = c.candidate_id, candidate_name = c.candidate_name, party_name = p.party_name }).FirstOrDefault(); } catch(Exception ex) { // 异常处理逻辑 }
这种方式不仅解决了初始化的问题,还让代码可读性更高,后续如果需要在其他方法中传递这个对象也更方便。
内容的提问来源于stack exchange,提问作者Mohammad Tofiq
相关产品推荐
相关产品推荐

