当前位置: 首页 > news >正文

qq网页空间seo优化排名推广

qq网页空间,seo优化排名推广,wordpress pdf 下载失败,易语言做网站视频首先提醒大家一下#xff0c;docs.microsoft.com上的《C# 指南》是这样描述out 参数修饰符[1]的#xff1a;作为 out 参数传递的变量在方法调用中传递之前不必进行初始化。但是#xff0c;被调用的方法需要在返回之前赋一个值。请注意上面加粗的话#xff0c;然后看看下面的… 首先提醒大家一下docs.microsoft.com上的《C# 指南》是这样描述out 参数修饰符[1]的作为 out 参数传递的变量在方法调用中传递之前不必进行初始化。但是被调用的方法需要在返回之前赋一个值。请注意上面加粗的话然后看看下面的代码片段你觉得它能否编译通过private void Test(out System.Reflection.ParameterModifier obj) {  //什么也不做 } 如果你很肯定地回答“不能”那么恭喜你——答错了。我当初看到这段代码的第一感觉也是不能但发现代码确实能够编译通过。分析原因难道是语法改变了官方文档没更新 我又测试了一下private void Test2(out string obj)//编译失败 {  } private void Test3(out int obj)//编译失败 {  } 难道这个类型有什么特殊之处 我把dotnet/runtime中的ParameterModifier源代码[2]复制到本地项目,编译同样提示CS0177错误WTFprivate void Test(out ParameterModifier obj) {  } public readonly struct ParameterModifier {private readonly bool[] _byRef;public ParameterModifier(int parameterCount){if (parameterCount  0)throw new ArgumentException();_byRef  new bool[parameterCount];}public bool this[int index]{get  _byRef[index];set  _byRef[index]  value;}#if CORECLRinternal bool[] IsByRefArray  _byRef; #endif } 深入Roslyn应该是编译器做了什么特殊处理于是我clone了dotnet/roslyn源代码[3],本来想调试源代码的结果由于编译时依赖包一直下载不下来干脆直接读源代码了。通过查找错误提示must be assigned to before control leaves the current method定位到CSharpResources.resx确认错误编码为ERR_ParamUnassigned:  data nameERR_ParamUnassigned xml:spacepreservevalueThe out parameter {0} must be assigned to before control leaves the current method/value/data 查找ERR_ParamUnassigned定位到了编译错误信息被添加的位置DefiniteAssignment.cs文件内的ReportUnassignedOutParameter方法protected virtual void ReportUnassignedOutParameter(ParameterSymbol parameter, SyntaxNode node, Location location) {......if (Diagnostics ! null  this.State.Reachable){......if (!reported){Debug.Assert(!parameter.IsThis);Diagnostics.Add(ErrorCode.ERR_ParamUnassigned, location, parameter.Name);}} } 因为同样的方法定义只是参数类型不一样导致编译报错因此猜测这个方法肯定进入了只是this.State.Reachable值不同的原因Reachable的代码如下public bool Reachable {get{return Assigned.Capacity  0 || !IsAssigned(0);} } public bool IsAssigned(int slot) {return /*(slot  -1) || */Assigned[slot]; }public void Assign(int slot) {if (slot  -1)return;Assigned[slot]  true; } 继续查找Assign的调用位置发现一段很有意思的代码Debug.Assert(!_emptyStructTypeCache.IsEmptyStructType(type)); ...... state.Assign(slot); IsEmptyStructType是不是意味着空Struct不检查立马来试试private void Test(out EmptyStruct obj)///编译通过 {  }public struct EmptyStruct {  } 继续探究但是ParameterModifier明显不是空Struct,而且更奇怪的是为什么将源代码复制到本地项目又不能编译了。 带着这个疑问我们继续深挖private bool IsEmptyStructType(TypeSymbol type, ConsListNamedTypeSymbol typesWithMembersOfThisType) {......result  CheckStruct(typesWithMembersOfThisType, nts);......return result; }private bool CheckStruct(ConsListNamedTypeSymbol typesWithMembersOfThisType, NamedTypeSymbol nts) {if (!typesWithMembersOfThisType.ContainsReference(nts)){......return CheckStructInstanceFields(typesWithMembersOfThisType, nts);}return true; } private bool CheckStructInstanceFields(ConsListNamedTypeSymbol typesWithMembersOfThisType, NamedTypeSymbol type) {// PERF: we get members of the OriginalDefinition to not create substituted members/types //       unless necessary.foreach (var member in type.OriginalDefinition.GetMembersUnordered()){if (member.IsStatic){continue;}var field  GetActualField(member, type);if ((object)field ! null){var actualFieldType  field.Type;if (!IsEmptyStructType(actualFieldType, typesWithMembersOfThisType)){return false;}}}return true; } 代码检查每个字段的类型是否是“空Struct”。这意味着如果所有实例字段都是“空Struct”则原始类型也被视为“空Struct”否则为“非空Struct”。看来关键就在GetActualField了private FieldSymbol GetActualField(Symbol member, NamedTypeSymbol type) {switch (member.Kind){case SymbolKind.Field:var field  (FieldSymbol)member;// Do not report virtual tuple fields.// They are additional aliases to the fields of the underlying struct or nested extensions.// and as such are already accounted for via the nonvirtual fields.if (field.IsVirtualTupleField){return null;}return (field.IsFixedSizeBuffer || ShouldIgnoreStructField(field, field.Type)) ? null : field.AsMember(type);case SymbolKind.Event:var eventSymbol  (EventSymbol)member;return (!eventSymbol.HasAssociatedField || ShouldIgnoreStructField(eventSymbol, eventSymbol.Type)) ? null : eventSymbol.AssociatedField.AsMember(type);}return null; }private bool ShouldIgnoreStructField(Symbol member, TypeSymbol memberType) {return _dev12CompilerCompatibility                              // when were trying to be compatible with the native compiler, we ignore((object)member.ContainingAssembly ! _sourceAssembly ||   // imported fieldsmember.ContainingModule.Ordinal ! 0)                       //     (an added module is imported)IsIgnorableType(memberType)                                  // of reference type (but not type parameters, looking through arrays)!IsAccessibleInAssembly(member, _sourceAssembly);          // that are inaccessible to our assembly. } 必须是Struct和代码不在同一个程序集((object)member.ContainingAssembly ! _sourceAssembly字段类型必须是引用类型或数组(IsIgnorableType),并且是私有的!IsAccessibleInAssembly。我们来验证一下将ParameterModifier源代码复制到类库中//ConsoleApp1.csproj private void Test(out ClassLibrary1.ParameterModifier obj) { }//ClassLibrary1.csproj namespace ClassLibrary1 {public readonly struct ParameterModifier{private readonly bool[] _byRef; //编译通过//private readonly string _byRef; //编译通过//private readonly int _byRef; //编译失败//public readonly bool[] _byRef; //编译失败} } 结论今天我们深入了编译器的源代码分析了一个简单问题的成因一般来说out参数必须在被调用方法将控制返回给调用方之前初始化。然而编译器可以进行优化在某些情况下如类型是没有Public字段的Struct将不会显示编译错误。虽然感觉知道了也并没什么鸟用但至少说明了好的代码风格还是非常重要的希望这篇文章能够对你有所启发。欢迎关注我的个人公众号”My IO“参考资料[1]out 参数修饰符: https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/out-parameter-modifier[2]ParameterModifier源代码: https://github.com/dotnet/runtime/blob/main/src/libraries/System.Private.CoreLib/src/System/Reflection/ParameterModifier.cs[3]dotnet/roslyn源代码: https://github.com/dotnet/roslyn
http://www.yutouwan.com/news/308966/

相关文章:

  • 网站建设要规避的新媒体代运营
  • 森网站建设粮油移动端网页设计素材
  • 陕西住房与城乡建设部网站wordpress手机浏览器
  • 网站的空间怎么查深圳网络营销外包公司推荐
  • 正规的网站制作联系方式百度大搜是什么
  • 做推广一般那些网站比较好什么网站可以帮人做ppt赚钱
  • 黑别人网站凡科小程序免费制作平台
  • 书店网站建设个人总结如何做电子书下载网站
  • 宛城区网站制作seo关键词排行优化教程
  • 北京专业网站外包公司国外高清视频素材网站推荐
  • 网站建设公司违法做网站一月工资
  • 网站免费网站的方法网页设计策划书
  • 福建省建设系统网站wordpress 域名 根目录
  • 网站前台模板设计网站上线前需要做什么
  • 河北省建设工程安全生产网站wordpress文章文件
  • wordpress社团网站商标图案参考
  • 个人网站备案需要哪些北京建站模板源码
  • 怎么做网站后期维护wordpress第三方评论
  • 欧美风格网站模版手机电脑同步网站开发
  • 榆次做企业网站河北网站优化公司
  • 安平有做农产品的网站被wordpress关键词插件
  • 如何选择丹徒网站建设河南企业网官方网站
  • 商城网站模版代码长沙做网站找谁
  • 外贸营销型建站网站建设适合的企业
  • 沈阳方正建设监理网站北京公司注册地址查询
  • 供灯放生网站开发中国建筑官网一测二测成绩多少算及格
  • 重庆网站seo按天计费怎么修改wordpress主题字体
  • 网站建设公司的公司排名手机网站的后台管理
  • 济南网站搜索排名北京网站案例
  • 电商网站建设技术可行性分析怎么看wordpress用了哪个主题