Day10

一、Data Annotation——数据注释

1、Data Annotation Basics——数据注释基础知识

数据注释是向类或类的成员添加更多上下文信息的一种方法。注释有三个主要类别:验证属性:向数据添加验证标准。显示属性:指定数据应该如何显示给用户。建模属性:添加关于使用情况和与其他类的关系的信息.

下面是一个使用了两个验证属性和一个显示属性的示例:

class Kid
{
 [Range(0, 18)] //年龄不能超过18岁,也不能为负值
 public int Age { get; set; }  
 [StringLength(MaximumLength = 50, MinimumLength = 3)] //名称不能超过3个字符或超过50个字符
 public string Name { get; set; }
 [DataType(DataType.Date)] //生日将仅显示为日期(没有时间)
 public DateTime Birthday { get; set; }
}

数据注释主要用于诸如ASP等框架中。净收入。例如,在ASP中。NET MVC,当一个模型被控制器方法接收时,模型状态。IsValid()可以用来判断接收到的模型是否尊重其所有的验证属性。显示属性也在ASP中使用。使用NET MVC来确定如何在网页上显示值。 

2、Creating a custom validation attribute——创建自定义验证属性

可以通过从验证属性基类中衍生来创建自定义验证属性,然后根据需要重写虚拟方法。

3、 Validation Attributes——验证属性

示例:当通过验证属性进行验证时,需要使用的属性。验证方法时,如果Name属性为空值或只包含空格,则此属性将返回一个错误。
1 public class ContactModel
2 {
3  [Required(ErrorMessage = "Please provide a name.")]
4  public string Name { get; set; }
5 }

示例:字符串长度属性

二、关键词

1、as

as关键字是一个类似于强制转换的运算符。如果不能进行强制转换,则使用as生成空,而不是导致无效的强制转换异常。

示例:

  结果是分别是Hello,null,null

 2、virtual, override, new

写的是时候,你可以new一个实例对象也可以通过重载和虚拟方法来调用方法。

虚拟和覆盖虚拟关键字允许一个方法、属性、索引器或事件被派生的类覆盖,并呈现多态行为。(c#中默认成员是非虚拟的)

 

 3、const

const用于表示在整个程序生命周期中永远不会发生变化的值。它的值在编译时是恒定的,而不是只读关键字,它的值在运行时是恒定的

1 const double c = 299792458; // Speed of light
2 double CalculateEnergy(double mass)
3 {
4  return mass * c * c;
5 }

4、async, await

异步和等待关键字在相同的函数中成对使用,如下图所示。await关键字用于暂停当前异步方法的执行,直到等待的异步任务完成和/或返回其结果为止。为了使用await关键字,使用它的方法必须被标记为异步关键字。强烈不鼓励对void使用异步操作。

 1 public async Task DoSomethingAsync()
 2 {
 3 Console.WriteLine("Starting a useless process...");
 4  Stopwatch stopwatch = Stopwatch.StartNew();
 5  int delay = await UselessProcessAsync(1000);
 6  stopwatch.Stop();
 7  Console.WriteLine("A useless process took {0} milliseconds to execute.",
 8 stopwatch.ElapsedMilliseconds);
 9 }
10 public async Task<int> UselessProcessAsync(int x)
11 {
12  await Task.Delay(x);
13  return x;
14 }
15 
16 //输出:
17 "Starting a useless process..."
18 **... 1 second delay... **
19 "A useless process took 1000 milliseconds to execute."

以上的方法如果不重新建立一个实例,会报错,可以使用static方法:

5、abstract

不能实例化标记有关键字抽象的类。如果类包含抽象成员或者继承了没有实现的抽象成员,则必须标记为抽象。即使没有涉及到抽象成员,一个类也可以被标记为抽象成员

 注意:不能够直接实例化抽象类,无论是抽象类作为父类还是子类。当抽象类成为父类的时候,需要在子类中重写。抽象类存在的意义是让实现和设计分开,都要去饭店吃饭,但是吃什么由顾客自己决定,只是统一了去饭店吃饭这个方法。

 

 

 

6、fixed、default、sealed

fixed:固定语句将内存固定在一个位置。内存中的对象通常会四处移动,这使得垃圾收集成为可能。但是,当我们使用指向内存地址的不安全指针时,就不能移动该内存。fixed只能用于结构中的字段(也必须在不安全的上下文中使用)

default:对于类、接口、委托、数组、可为空(如int?)和指针类型,默认值(TheType)返回空

sealed:当应用于类时,密封的修改器阻止其他类继承.当应用到虚拟方法(或虚拟属性)时,密封的修改器可防止在派生类中覆盖此方法(属性)

 7、readonly

只读关键字是一个字段修改符。当字段声明包含只读修改器时,对该字段的分配只能作为声明的一部分或在同一类中的构造函数中发生。只读关键字与const关键字不同。const字段只能在字段的声明时初始化。只读字段可以在声明处或在构造函数中初始化。因此,根据所使用的构造函数,只读字段可以有不同的值。在注入依赖项时,经常使用只读关键字。

\注意:在构造函数中,可以重新分配一个只读字段

 1 public class Car
 2 {
 3  public double Speed {get; set;}
 4 }
 5 //In code
 6 private readonly Car car = new Car();
 7 private void SomeMethod()
 8 {
 9  car.Speed = 100;
10 }

 8、dynamic

动态关键字用于动态类型的对象。声明为动态的对象放弃编译时静态检查,而是在运行时进行计算。

1 using System;
2 using System.Dynamic;
3 dynamic info = new ExpandoObject();
4 info.Id = 123;
5 info.Another = 456;
6 Console.WriteLine(info.Another);//结果:456

下面的示例使用动态与新闻软件的库Json。NET,以便轻松地从反序列化的JSON文件中读取数据。

try
{
 string json = @"{ x : 10, y : ""ho""}";
 dynamic deserializedJson = JsonConvert.DeserializeObject(json);
 int x = deserializedJson.x;
 string y = deserializedJson.y;
 //int z =反序列化Json.z;
 //抛出运行时绑定器异常}
}
catch (RuntimeBinderException e)
{
 //当使用未分配给动态变量的属性
 //没有分配给动态变量的变量被使用
}

9、ref、out

引用和out关键字会导致参数通过引用传递,而不是通过值传递。对于值类型,这意味着被调用方可以更改变量的值。

 1 int number = 1;
 2 Console.WriteLine("Before AddByRef: " + number); // number = 1
 3 AddOneByRef(ref number);
 4 Console.WriteLine("After AddByRef: " + number); // number = 2
 5 SetByOut(out number);
 6 Console.WriteLine("After SetByOut: " + number); // number = 34
 7 void AddOneByRef(ref int value)
 8 { 
 9  value++;
10 }
11 void SetByOut(out int value)
12 {
13  value = 34;
14 }

注意此处开始number的值是1,number++,先是1然后才是自加1

10、lock

lock为代码块提供了线程安全性,因此在同一进程中只能由一个线程访问它

 1 private static object _lockObj = new object();
 2 static void Main(string[] args)
 3 {
 4  Task.Run(() => TaskWork());
 5  Task.Run(() => TaskWork());
 6  Task.Run(() => TaskWork());
 7  Console.ReadKey();
 8 }
 9 private static void TaskWork()
10 {
11  lock(_lockObj)
12  {
13  Console.WriteLine("Entered");
14  Task.Delay(3000);
15  Console.WriteLine("Done Delaying");
16  Console.WriteLine("Leaving");
17  } 
18 }
19 
20 //结果是:
21 Entered
22 Done Delaying
23 Leaving
24 Entered
25 Done Delaying
26 Leaving
27 Entered
28 Done Delaying
29 Leaving

 

posted @ 2022-12-09 16:57  末叶da  阅读(25)  评论(0)    收藏  举报