最近工作压力比较大,不得已开始自学C#。同时网站开发业务开展迫在眉睫,只能先从ASP.NET学起。回想一下,连C#和ASP.NET的关系都没有明白,就被赶鸭子上架了。。。我觉得这将是我工作以来最具有戏剧性的一笔!!
话不多说,网上搜了一下洞庭夕照的“学用MVC4做网站”,感觉最后从我现在的水平看实在是惊为天人之作,于是便开始一边看一边做了起来,无奈这位兄台技术在我之上不知多高,很多东西直接省略不讲,看得我实在费力,又找不到更好的教程,只能一边看一边百度。
这一笔真的浓厚。。。
一、中括号
Model 类里[Key]这个东西,类似于JAVA里的反射,ASP.NET:类中使用中括号([...])的作用。该标记不起任何实际作用,仅是告诉vs该语句下面的方法(Method)是ObjectDataSource的默认绑定方法,标记的作用是为了让编译器更好的为 ObjectDatasource 向导找到合适的方法。但是要加上using System.ComponentModel.DataAnnotations;这条引用。
二、/// <summary>
C#中在注释函数的时候连用3个斜杠,即“///”编译器会自动生成函数相关的注释段,但是需要具体的编译器代码提示,那还需要添加相应的内容。
先写好函数或方法,然后在函数或方法的上一行输入“///”后,系统会自动出来<summayr>.....</summary>以及参数等,在补全说明即可
三、datetime? 和 datetime 有什么区别
CSharp中,有两种类型的变量。
基本类型和引用类型
基本类型变量在定义一个变量的时候,不允许将该变量设置为null。但是在有的时候,我们又希望该基本类型拥有可以为null的能力。所以我们在该基本类型后面 加? 就可以将该基本类型变成应用类型。如 int => int? long => long? 等
此时 int? 定义的变量,就是应用类型了,可以为null,而不再是一个基本的类型。所有的基本类型转换成的引用类型,都有value这个属性,该属性是该应用的值。所有 datetime = datetime?.value
四、[HttpPost]
System.Web.Mvc.dll中对它的注解是:表示一个特性,该特性用于限制操作方法,以便该方法仅处理 HTTP POST 请求。
具体来讲,就是在对于Mvc Controller中的方法,如果你希望该方法只能通过前台表单的Post方式来访问并且传输数据的话,通过添加[HttpPost]注解即可实现,这样,该方法就不会通过Get方法进行请求,限制了该操作方法的请求类型。
五、Repository模式
这个模式很深奥,在这里只能先列举一下简单的释义,随后再深入学习。
六、DbSet<TEntity>类和DbContext类
dbContext里面的dbset<TEntity>属性的多少 能对系统造成性能影响吗?
一语惊醒梦中人。看代码总是有dbset<TEntity>,但一直不知道是什么解释,今天搜到这个问题,原来是一个属性,或者是给定类型的所有实体的集合或可从数据库中查询的给定类型的所有实体的集合。 可以使用 DbContext.Set 方法从 DbContext 中创建 DbSet 对象。不过两个使用的区别是什么?
MVC中使用Entity Framework 基于方法的查询学习笔记 (二)
七、数据上下文
数据上下文,就是当前对象(主要是UI元素)与之绑定的数据对象。所有对该控件的数据绑定({Binding})如果不额外声明Source,则默认的Source就是DataContext指向的数据对象。可以理解为 DataSource
或者
数据上下文就是不止它自身可以访问,其子元素皆可访问。
比如有这么一个数据类型:
public class Person
{
public int ID{get;set;}
public string Name{get;set;}
public int Age{get;set;}
public string Address{get;set;}
}
将该类型的一个实例设置为某UserControl的DataContext;
this.DataContext = new Person();
那么在xaml中,binding时就是使用的这个上下文
<UserControl ...>
<StackPanel>
<TextBlock Text={Binding ID}/>
<TextBlock Text={Binding Name}/>
<TextBlock Text={Binding Age}/>
<TextBlock Text={Binding Address}/>
</StackPanel>
</UserControl>
你只是将Person对象赋给了UserControl的DataContext,但是其内部的TextBlock依然可以访问得到这个对象的属性。
八、virtula与override
在基类(父类)中用virtual修饰符声明一个虚方法,然后在在派生类(子类)中用override修饰符覆盖基类虚方法。表明是对基类的虚方法重载。这种优势在于它可以在程序运行时再决定调用哪一个方法,这就是所谓的“运行时多态”或者称动态绑定。
九、~
这是什么?!C#里的各种符号也是醉了。。。
析构函数(destructor) 与构造函数相反,当对象脱离其作用域时(例如对象所在的函数已调用完毕),系统自动执行析构函数。析构函数往往用来做“清理善后” 的工作(例如在建立对象时用new开辟了一片内存空间,应在退出前在析构函数中用delete释放)。析构函数名也应与类名相同,只是在函数名前面加一个波浪符~,例如~stud( ),以区别于构造函数。它不能带任何参数,也没有返回值(包括void类型)。只能有一个析构函数,不能重载。如果用户没有编写析构函数,编译系统会自动生成一个缺省的析构函数,它也不进行任何操作。所以许多简单的类中没有用显式的析构函数。
十、 seal
1、当对一个类应用 sealed 修饰符时,此修饰符会阻止其他类从该类继承。 在下面的示例中,类 B 从类 A 继承,但是任何类都不能从类 B 继承。
class A {}
sealed class B : A {}
2、还可以在重写基类中的虚方法或虚属性的方法或属性上使用 sealed 修饰符。 这将使您能够允许类从您的类继承,并防止它们重写特定的虚方法或虚属性
在下面的示例中,Z 从 Y 继承,但 Z 无法重写在 X 中声明并在 Y 中密封的虚函数 F。
class X
{
protectedvirtualvoid F() { Console.WriteLine("X.F"); }
protectedvirtualvoid F2() { Console.WriteLine("X.F2"); }
}
class Y : X
{
sealedprotectedoverridevoid F() { Console.WriteLine("Y.F"); }
protectedoverridevoid F2() { Console.WriteLine("X.F3"); }
}
class Z : Y
{
// Attempting to override F causes compiler error CS0239.
// protected override void F() { Console.WriteLine("C.F"); }
// Overriding F2 is allowed.
protectedoverridevoid F2() { Console.WriteLine("Z.F2"); }
}
十一、=>
又一个符号,明白了就觉得好用,不明白的看着这么个玩意真的很蛋疼!