C# swich, constant, readonly,static, StringBuilder 和字段与属性

switch语句

switch语句中各个常量表达式的值不能相等. 此外, C#还规定每个case分支都必须以breakreturngotothrow语句来结束, 而且语句中的任何代码都不能修改控制表达式的值, 这就使得switch语句中case分支的排列顺序不会影响到整个语句的功能.

switch语句中,case分支的breakreturngotothrow语句之间有什么区别?

break是只离开当前的swich语句块; return是直接跳出当前运行的函数, 如果是主函数则退出程序 ; goto是前往指定的标签位置; throw是在运行时掷出一个异常, 终止程序运行或者被其他代码捕获继续运行.

例如下面的程序根据不同的输入:

int num = int.Parse(Console.ReadLine());
switch (num)
{
    case 0: Console.WriteLine("num = 0"); break;
    case 1: Console.WriteLine("num = 1"); return;
    case 2: Console.WriteLine("num = 2"); goto there;
    case 3: Console.WriteLine("num = 3"); 
        throw new Exception("Stop a swich with `throw`");
    there: Console.WriteLine("Now I am at `there`"); break;
}
Console.WriteLine("End `swich`");

得到如下的输出:

> 0
num = 0
End `swich`
> 1
num = 1
> 2
num = 2
Now I am at `there`
End `swich`
> 3
num = 3
运行时异常: System.Exception:“Stop a swich with `throw`

静态成员是否可以通过实例对象访问

不可以! 编译器会报错:

class Student
{
  static public string School = "WHUT";
  public string Name;
  public Student(string name)
  {
      this.Name = name;
  }
}
internal class Program
{
  static void Main(string[] args)
  {
      Student myStudent = new Student("人名");
      Console.WriteLine($"学生姓名: {myStudent.Name}");
      // Console.WriteLine($"学校:{myStudent.School}");
      // 错误 CS0176 无法使用实例引用来访问成员“Student.School”; 请改用类型名来限定它
      Console.WriteLine($"学校: {Student.School}");
  }
}

字段Field与属性Property

在C#中, 我们可以非常自由的、毫无限制的访问公有字段, 但在一些场合中, 我们可能希望限制只能给字段赋于某个范围的值、或是要求字段只能读或只能写, 或是在改变字段时能改变对象的其他一些状态, 这些单靠字段是无法做到的, 于是就有了属性, 属性中包含两个块:set和get, set块负责属性的写入工作, get块负责属性的读取工作. 在两个块中都可以做一些其他操作, 如在set中验证赋的值是否符合要求并决定是否进行赋值. 当缺少其中一块时属性就只能读或只能写, set和get块中属性必需有一个, 因为即不能读又不能写的属性是没有意义的.

属性的操作类似 SQL 中的触发器, 将属性和字段分开, 可以做到数据存储与数据操作的进一步分离, 并且可以在获取和修改数据时实现检查, 限制, 逻辑判断等复杂操作.

constreadonly

const限定用于类, 意为"常量", 默认有static的作用, 限定通过类来访问, 并且不可修改.

readonly限定用于对象, 意为"只读", 其限定的字段只能在对象被创建时定义, 不能在后续修改, 即限定的字段只能在构造函数中被修改. 即使是在对象内部, 也不能修改只读字段.

class Student
{
  public const string School = "WHUT";
  readonly public string Name;
  public Student(string name)
  {
      this.Name = name;
  }
  public void testFun(string name)
  {
      // this.Name = name;
      // 错误 CS0191 无法分配到只读字段(除非在定义了该字段的类型的构造函数或 init - only 资源库中, 或者在变量初始值设定项中)
  }
}

internal class Program
{
  static void Main(string[] args)
  {
      var myStu = new Student("姓名");
      Console.WriteLine(myStu.Name);
      // myStu.Name = "人名";
      // 错误 CS0191 无法分配到只读字段(除非在定义了该字段的类型的构造函数或 init - only 资源库中, 或者在变量初始值设定项中)
      // Console.WriteLine(myStu.School);
      // 错误 CS0176 无法使用实例引用来访问成员“Student.School”;请改用类型名来限定它
      // const 限定隐含 static 限定, 仅用于类
      // Student.School = "WUT";
      // 错误 CS0131 赋值号左边必须是变量、属性或索引器
  }
}
 

StringBuilder是否类似于 Python 中可变对象

何为与 Python 类似: 可变对象的典型是 list 结构, 可以调用其方法修改其自身的值, 并且调用后不返回值, 强行获取会得到None的结果, StringBuilder是否也是这样?

StringBuilder位于System.Text命名空间中.其与 Python 中的 list 类似, 可以通过方法修改其本身的值. 但不同的是, 其方法有返回值, 会返回一个StringBuilder对象, 这个对象是原来对象的引用:

internal class Program
{
  static void Main(string[] args)
  {
      StringBuilder strb0 = new StringBuilder("tel:19900008888");
      Console.WriteLine($"strb0 = \"{strb0}\"");
      Console.WriteLine("Insert \"+86 \" into 4");
      StringBuilder strb1 = strb0.Insert(4, "+86 "); 
      // 虽然有返回值, 但依然是 strb0 引用的对象
      Console.WriteLine($"strb0 = \"{strb0}\"");
      Console.WriteLine($"strb1 = \"{strb1}\"");
      Console.WriteLine("Remove \"tel:\"");
      strb1.Remove(0, 4); // strb1 与 strb0 引用的同一对象, 会影响其值
      Console.WriteLine($"strb1 = \"{strb1}\"");
      Console.WriteLine($"strb0 = \"{strb0}\"");
   }
}

上述程序输出为:

strb0 = "tel:19900008888"
Insert "+86 " into 4
strb0 = "tel:+86 19900008888"
strb1 = "tel:+86 19900008888"
Remove "tel:"
strb1 = "+86 19900008888"
strb0 = "+86 19900008888"
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值