<C#>new几种用法

在 C# 中,new 关键字可用作运算符、修饰符或约束。

new 运算符
用于创建对象和调用构造函数。

new 修饰符
用于向基类成员隐藏继承成员。

new 约束
用于在泛型声明中约束可能用作类型参数的参数的类型。

new 修饰符(C# 参考)

在用作修饰符时,new 关键字可以显式隐藏从基类继承的成员。隐藏继承的成员意味着该成员的派生版本将替换基类版本。在不使用 new 修饰符的情况下隐藏成员是允许的,但会生成警告。使用 new 显式隐藏成员会取消此警告,并记录代之以派生版本这一事实。

若要隐藏继承的成员,请使用相同名称在派生类中声明该成员,并使用 new 修饰符修饰该成员

new 运算符(C# 参考)

用于创建对象和调用构造函数。例如:
Class1 o = new Class1();

2.也用于为值类型调用默认的构造函数

  例:int myInt = new int();

 myInt 初始化为 0,它是 int 类型的默认值。该语句的效果等同于:int myInt = 0;

  3.不能重载 new 运算符。

4.如果 new 运算符分配内存失败,则它将引发 OutOfMemoryException 异常



new 约束(C# 参考)

new 约束指定泛型类声明中的任何类型参数都必须有公共的无参数构造函数。当泛型类创建类型的新实例时,将此约束应用于类型参数,如下面的示例所示:

class ItemFactory<T> where T : new()
{
public T GetNewItem()
{
return new T();
}
}

 

 

通过继承隐藏名称采用下列形式之一:

  1.引入类或结构中的常数、指定、属性或类型隐藏具有相同名称的所有基类成员。

  2.引入类或结构中的方法隐藏基类中具有相同名称的属性、字段和类型。同时也隐藏具有相同签名的所有基类方法。

  3.引入类或结构中的索引器将隐藏具有相同名称的所有基类索引器。

  4.在同一成员上同时使用 new 和 override 是错误的。

  注意:在不隐藏继承成员的声明中使用 new 修饰符将生成警告。

 

 示例

  在该例中,嵌套类 MyClass 隐藏了基类中具有相同名称的类。该例不仅说明了如何使用完全限定名访问隐藏类成员,同时也说明了如何使用 new 修饰符消除警告消息。

  1 using System;
  2
  3 public class MyBaseC
  4
  5 {
  6
  7 public class MyClass
  8
  9 {
  10
  11 public int x = 200;
  12
  13 public int y;
  14
  15 }
  16
  17 }
  18
  19
  20
  21 public class MyDerivedC : MyBaseC
  22
  23 {
  24
  25 new public class MyClass // nested type hiding the base type members
  26
  27 {
  28
  29 public int x = 100;
  30
  31 public int y;
  32
  33 public int z;
  34
  35 }
  36
  37
  38
  39 public static void Main()
  40
  41 {
  42
  43 // Creating object from the overlapping class:
  44
  45 MyClass S1 = new MyClass();
  46
  47
  48
  49 // Creating object from the hidden class:
  50
  51 MyBaseC.MyClass S2 = new MyBaseC.MyClass();
  52
  53
  54
  55 Console.WriteLine(S1.x);
  56
  57 Console.WriteLine(S2.x);
  58
  59 }
  60
  61 }
  62
  输出

  100

  200

你写的这段 C# 代码: ```csharp Dictionary<string, List<int>> 某类型点阵集合 = new Dictionary<string, List<int>>{ { "qing", new List<int>() }, { "mid", new List<int>() }, { "zhong", new List<int>() } }; ``` 👉 **语法本身在现代 C#(.NET 6+ / C# 9+)中是完全合法的**,不会报错。 但如果出现 **编译错误**,可能是以下几种原因导致的。我们来逐一分析并提供解决方案。 --- ## ❌ 常见报错及解决方法 ### 🔴 报错 1:`Invalid token '{' in class, struct, or interface member declaration` #### 📌 出现场景: 你在 **类的内部但方法外部** 直接写初始化块,例如: ```csharp public class MyClass { Dictionary<string, List<int>> 某类型点阵集合 = new Dictionary<string, List<int>> { { "qing", new List<int>() }, // ❌ 错误位置 { "mid", new List<int>() }, { "zhong", new List<int>() } }; } ``` 这是不允许的,除非你使用 **字段初始化 + 支持集合初始化的语法(C# 6+)** #### ✅ 正确做法:加上 `= new()` 并确保语法正确 ✅ 修正后的字段定义(支持 C# 6+): ```csharp public class MyClass { private Dictionary<string, List<int>> 某类型点阵集合 = new Dictionary<string, List<int>> { { "qing", new List<int>() }, { "mid", new List<int>() }, { "zhong", new List<int>() } }; } ``` > ✅ 这样写是合法的!必须是在 **字段声明时直接赋值** 才能用 `{}` 初始化。 --- ### 🔴 报错 2:缺少分号 `;` 你的代码最后少了一个分号: ```csharp {"zhong":new List<int>() }, // 多余逗号或缺少分号? }; // 这里需要分号 ``` #### ✅ 正确完整写法(带分号): ```csharp Dictionary<string, List<int>> 某类型点阵集合 = new Dictionary<string, List<int>> { { "qing", new List<int>() }, { "mid", new List<int>() }, { "zhong", new List<int>() } }; // ⬅️ 分号不能少 ``` --- ### 🔴 报错 3:项目语言版本过低(不支持集合初始化器) 如果你使用的是非常老的 .NET Framework 版本(如 .NET 2.0~3.5),可能不支持集合初始化器。 #### ✅ 解决方案:升级目标框架 或 使用传统方式 ##### ✅ 替代写法(适用于所有版本): ```csharp Dictionary<string, List<int>> 某类型点阵集合 = new Dictionary<string, List<int>>(); 某类型点阵集合.Add("qing", new List<int>()); 某类型点阵集合.Add("mid", new List<int>()); 某类型点阵集合.Add("zhong", new List<int>()); ``` 这种方式兼容性最强。 --- ### 🔴 报错 4:中文变量名问题(罕见) 虽然现代 C# 允许使用 Unicode 标识符(包括中文变量名),但某些编辑器或编译环境可能会有问题。 #### ✅ 测试是否是命名问题: ```csharp var test = new Dictionary<string, List<int>> { { "qing", new List<int>() } }; // 看看这个能不能通过 ``` 如果可以,则说明只是变量名高亮/显示异常,不是语法错误。 > ✅ 中文变量名是合法的,但建议仅用于演示或教学。 --- ### 🔴 报错 5:缺少 using System.Collections.Generic; 如果没有引入命名空间,`Dictionary<,>` 无法识别。 #### ✅ 添加引用: ```csharp using System; using System.Collections.Generic; // ⬅️ 必须有这个 ``` --- ## ✅ 推荐最终写法(现代 C#) ```csharp using System; using System.Collections.Generic; class Program { static void Main() { Dictionary<string, List<int>> 某类型点阵集合 = new() { { "qing", new() }, { "mid", new() }, { "zhong", new() } }; // 测试添加数据 某类型点阵集合["qing"].Add(1); 某类型点阵集合["mid"].Add(2); foreach (var kvp in 某类型点阵集合) { Console.WriteLine($"{kvp.Key}: [{string.Join(", ", kvp.Value)}]"); } } } ``` > 输出: ``` qing: [1] mid: [2] zhong: [] ``` --- ## ✅ 总结:如何避免错误 | 问题 | 解决方案 | |------|----------| | 缺少分号 | 结尾加 `;` | | 写在类体中未声明为字段 | 放入方法内,或作为私有字段 | | 语言版本太低 | 升级到 .NET 6+ 或使用 `.Add()` 方式 | | 缺少 using | 添加 `using System.Collections.Generic;` | | 不支持 `new()` | 改成 `new Dictionary<string, List<int>>()` | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值