C#6.0的语法<一>

一、自动初始化属性:

确实这个比之前的版本简化了一下,不过你肯定很好奇,到底编译器给我们做了哪些东西呢?

<span style="color:#000000;">class Student
{
    public string Name { get; set; } = "ctrip";
}
</span>

 

从这张图中可以看到,在ctor中<Name>k__backingfield=“ctrip“的赋值在base::ctor之前,这就说明name是变量初始化赋值,而不属于

构造函数赋值,那有什么区别呢,如果base::ctor在<Name>k__backingfield=”ctrip"之前,那就是构造函数赋值了,不过我得特别要指明

一下,是源代码级别的区别,而不是IL中的区别,因为在IL中都是构造函数赋值,不过语句顺序不一样而已,然后我把内部做的代码复原如下:


 1     class Student
 2     {
 3         private string k__BackingField = "ctrip";
 4 
 5         public string Name
 6         {
 7             get
 8             {
 9                 return k__BackingField;
10             }
11 
12             set
13             {
14                 k__BackingField = value;
15             }
16         }
17     }

然后再看看怎么让base::ctor在<Name>k__backingfield="ctrip"之前。


 1     class Student
 2     {
 3         private string k__BackingField;
 4 
 5         public string Name
 6         {
 7             get
 8             {
 9                 return k__BackingField;
10             }
11 
12             set
13             {
14                 k__BackingField = value;
15             }
16         }
17 
18         public Student()
19         {
20             k__BackingField = "ctrip";
21         }
22     }

不好意思,一不小心就扯到了变量初始化和构造函数赋值在源代码级别的区别。

 

二:只读属性初始化

  这个也是一个超级好玩的属性,先来看看代码:

复制代码
1     class Student
2     {
3         public string Name { get; }
4 
5         public Student(string name)
6         {
7             Name = name;
8         }
9     }
复制代码

但是我们记得,在之前的C#版本是不能这么写,但现在惹不住好奇心,先去底层看看到底生成了什么。

 

 

然后我就奇怪了,属性本来就可以是只读的,现在编译器已经放开了,那是不是有问题了,我如果真的是需要一个只读属性,这个该如何是好

呢?然后我就试着在Name属性中返回一个值,果然编译器不放行,这就说明编译器在里面还做了一个貌似合理的判断。

 

三:Lambda充当函数体

  这个听起来就有点怪怪的,还是先看个例子。

1     class Student
2     {
3         public string Name => "ctrip";
4 
5         public void Print(string name) => Console.WriteLine(name);
6     }

不过当我看到这种写法时,我也是醉了,假如你一年都没有接触C#,再回来看时,我想你肯定看不懂这些鸡巴代码了。。。没办法,还得继续

看看IL在底层都做了些什么?

 

当看到IL的时候再次醉了,其实=>仅仅是一个{}方法体括号而已呀!这不是徒增我们的学习成本么?然后我就继续想,这里的函数体就一条

console.wirteline语句,那我要是灌几条语句会怎么样呢?可以想象肯定是要加括号的,但是我真的加上{}后,编译器凌乱了。。。

 

那这个图就告诉我们,C#6.0的lamaba充当函数体的语法糖只适合一条语句,如果真要做到多条语句,那你只能单独提取一个方法出来,

就像下面这样。



<?xml version="1.0" encoding="utf-8"?> <configuration> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" /> </startup> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-4.0.1.2" newVersion="4.0.1.2" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="Microsoft.Bcl.AsyncInterfaces" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.0.0.0" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="System.IO.Pipelines" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-8.0.0.0" newVersion="8.0.0.0" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="Google.Protobuf" publicKeyToken="a7d26565bac4d604" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-3.26.1.0" newVersion="3.26.1.0" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="ZstdSharp" publicKeyToken="8d151af33a4ad5cf" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-0.7.6.0" newVersion="0.7.6.0" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="K4os.Compression.LZ4.Streams" publicKeyToken="2186fa9121ef231d" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-1.3.8.0" newVersion="1.3.8.0" /> </dependentAssembly> </assemblyBinding> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="MySql.Data" publicKeyToken="c5687fc88969c44d" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-8.4.0.0" newVersion="8.4.0.0" /> </dependentAssembly> </assemblyBinding> </runtime> </configura
最新发布
10-12
<think>好的,我现在需要解决用户的问题:如何让Visual Studio 2010支持C# 6.0语法特性,比如表达式主体方法和字典初始化器等。用户提到了安装Roslyn或其他方法。首先,我需要回忆C# 6.0的发布时间和相关工具的支持情况。 我记得C# 6.0是随Visual Studio 2015起发布的,而VS2010是比较旧的版本,官方可能不支持。Roslyn是微软开源的编译器平台,用来替代旧的csc.exe。用户可能希望通过Roslyn让旧版VS支持新语法。 接下来,我需要确认是否有可能在VS2010中集成Roslyn。根据之前的了解,Roslyn需要特定版本的MSBuild支持,而VS2010可能无法直接使用。但用户或许可以通过项目配置来使用新的编译器,即使IDE本身不支持语法高亮或智能提示。 然后,需要考虑具体步骤。例如,安装Microsoft.CodeDom.Providers.DotNetCompilerPlatform这个NuGet包,它可能允许项目使用Roslyn编译器。不过,这可能需要调整项目文件,修改.csproj中的配置,指定使用Roslyn的编译器路径。但VS2010可能不支持某些新的MSBuild任务或属性,可能会有兼容性问题。 另外,用户提到的C# 6.0特性如表达式主体方法,引用[1]、[2]、[3]都涉及到这些新语法。要让VS2010识别这些,可能需要编译器支持,而IDE的编辑器可能无法正确显示,但代码仍然可以编译。所以用户可能需要手动配置项目使用Roslyn编译器,即使IDE报错,但编译通过。 还需要检查是否有第三方工具或扩展支持。比如,是否有旧版VS的插件,或者社区提供的解决方案。但根据我的知识,官方可能没有为VS2010提供这样的支持,所以可能只能通过项目级别的编译器配置来实现。 总结可能的步骤:安装必要的NuGet包,配置项目文件使用Roslyn,处理可能出现的编译错误,以及接受IDE无法识别新语法的情况。同时,用户需要升级到更高版本的VS以获得更好的支持,但用户可能因为某些限制无法升级,所以需要替代方案。 最后,确保回答结构清晰,分步骤说明,并提醒用户潜在的问题和限制。引用相关的参考资料,如提到的表达式主体方法[^1]和字典初始化器[^2],以及Roslyn的相关信息[^3][^4]。</think>要让Visual Studio 2010支持C# 6.0语法特性(如表达式主体方法、字典初始化器等),需通过Roslyn编译器实现。以下是具体实现步骤及注意事项: --- ### 实现步骤 1. **安装Roslyn编译器包** 在项目中通过NuGet安装`Microsoft.CodeDom.Providers.DotNetCompilerPlatform`,该包会将Roslyn编译器集成到项目构建流程中。 ```powershell Install-Package Microsoft.CodeDom.Providers.DotNetCompilerPlatform -Version 1.0.0 ``` 2. **配置项目文件** 修改`.csproj`文件,添加Roslyn编译器路径(需根据实际路径调整): ```xml <PropertyGroup> <LangVersion>6</LangVersion> <CodeAnalysisIgnoreBuiltInCodeDomProvider>true</CodeAnalysisIgnoreBuiltInCodeDomProvider> </PropertyGroup> <ItemGroup> <PackageReference Include="Microsoft.CodeDom.Providers.DotNetCompilerPlatform" Version="1.0.0" /> </ItemGroup> ``` 3. **使用C# 6.0特性** 代码示例: ```csharp // 表达式主体方法(C# 6.0特性)[^1] public string GetName() => "C# 6.0"; // 字典初始化器(C# 6.0特性) var dict = new Dictionary<string, string> { ["key1"] = "value1", ["key2"] = "value2" }; ``` --- ### 注意事项 1. **IDE兼容性限制** - Visual Studio 2010的编辑器无法识别C# 6.0语法,会显示错误提示(如红色波浪线),但代码仍可通过Roslyn编译。 - 需手动编写代码,无智能提示支持。 2. **编译环境依赖** - 项目需在安装了`.NET 4.6+`或`.NET Core`的环境中构建。 - 若团队协作,所有成员需同步安装Roslyn相关NuGet包。 3. **替代方案建议** - 升级至Visual Studio 2015或更高版本,原生支持C# 6.0。 - 使用开源工具链(如`RoslynQuoter`)生成兼容代码。 --- ### 潜在问题 - **MSBuild版本冲突** VS2010默认使用MSBuild 4.0,可能需升级至MSBuild 14+(需手动配置,操作复杂)。 - **第三方库兼容性** 部分NuGet包可能依赖新版本SDK,需测试验证。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值