C# 基础知识(慢慢写,一次写一点。。)
1、数据类型:
(1)、值类型:enum、Struct、int、bool、char、float、double、byte、ulong、long、decimal等等
(2)、引用类型:object、string、dynamic这三个
这里enum与struct的用法与一些差别
1 ///2 /// 枚举写法 3 /// 4 public enum Myenum 5 { 6 e = 1, 7 n = 2, 8 u = 3, 9 m = 4, 10 t, 11 x, 12 s, 13 } 14 15 /// 16 /// 结构体写法 17 /// 结构体内嵌枚举 18 /// 19 public struct MyStruct 20 { 21 int i; 22 string str; 23 enum my 24 { 25 one = 1, 26 tow = 2, 27 three = 3 28 } 29 }
2、装箱与拆箱:
答:即值类型转换为引用类型的一个过程叫装箱,例如:
int i = 0; object obj = i;
拆箱的过程则相反:
object obj =1; int i = (int)obj;
PS:int.ToString();并不会装箱。
3、接口是否可以引用接口?
答:可以,例如:
interface IA { int i { get; set; } } interface IB{ int y { get; set; } } interface IC:IA,IB{ int x { get; set; } }
////// 抽象类继承接口,可继承多个 /// public abstract class ATest:IA,IB { public ATest() { }
public void TestA() { }
public void TestB() { } }
// 接口1 interface IA{ void TestA(); }
// 接口2 interface IB{ void TestB();
}
4、进程与线程
答:一个程序进程可以包含多个线程。
5、委托的关键词是什么,什么是委托?
答:委托的关键词是delegate,委托是一种引用类型,委托用于将方法作为参数传递给其他方法。 事件处理程序就是通过委托调用的方法。
// 委托定义
public delegate void Test();
public ATest()
{
// 委托初始化
Test test = new Test(TestA);
// 给委托绑定方法
// 多个方法绑定
test += TestA;
test += TestB;
// 去掉绑定
test -= TestB;
}
public void TestA()
{
Console.WriteLine("调用了委托方法");
}
public void TestB()
{
Console.WriteLine("调用了委托方法");
}
6、递归算法
public void fn (int i){ if ( i > 0 ) { i--; fn (i); } }
7、asp.net页面之间的几种传值方式。
这一段参考:https://www.cnblogs.com/zhangkai2237/archive/2012/05/06/2486462.html
答:
(1)、QueryString(URL)参数传值。优点:方便,对于安全性要求不高的可以使用;缺点:安全性不高,不能传递对象
用法:
string s_url; s_url = "/home/add?name=" + "Jon"; Response.Redirect(s_url);
(2)、Session服务器端保存。优点:使用简单,能传值也能传对象;缺点:容易丢失,服务器繁忙是容易丢失,存储大量的数据时会耗费比较多的服务器资源
用法:
Session["name"] = "jon"; var name = Session["name"]; // 移除单个 Session.Remove("name"); // 清空 Session.Clear();
// 销毁
销毁:Session.Abandon();
(3)、Cookie客户端浏览器保存,可以在页面之间传值,也可以把它放在HTTP请求头与服务器之间传值。优点:方便简单,是常用的一种保存用户登录状态的方法。缺点:不安全,容易被伪造。
用法:
// 添加cookie
HttpCookie objCookie = new HttpCookie("myCookie","Hello,Cookie!"); Response.Cookies.Add(objCookie); // 取出Cookie string myName1Value = Request.Cookies[ "myCookie" ].Value;
(4)、Application的作用是整个应用程序范围,一般用来存储公共信息,如网站访问数,文章的阅读数、评论数,点击数等。优点:使用简单,消耗的服务器资源少,还可以传递对象类型的数据,并且没有数据大小限制。缺点:作为一个全局性的变量,容易被误操作,一般单个用户的数据都不会用这种方式来存储。
用法:
// 添加 Application["name"] = "MyAppliction"; // 取值 Application.Lock(); string name = Application["name"].ToString(); Application.UnLock();
(5)、Server.Transfer ,这个Server.Transfer是直接在服务器端完成处理的,然后它可以将前一个页面的各种数据类型的值和控件的值进行传递到下一个页面。优点:直接在服务器完成转发重定向,减少客户端请求服务器次数,且可以传递各种数据,包括对象类型。缺点:浏览器中的URL地址是不改变,会导致在新的页面可能出现一些意想不到的问题。比如如果源页面和目的页面不在同一个虚拟目录或其子目录下,那么使用相对路径的图片、超链接都会导致错误的指向。
用法:
1 // 从index页面传值到add页面 2 // 定义属性 3 public string Name{get;set;} 4 // 传值的另一种方式 5 Server.Transfer("add","小明同学"); 6 7 // add页面接受数据 8 var result=(index)Context.Items["Key "]; 9 index newWeb = (source)Context.Handler; // 实例化index页面 10 string name = newWeb.Name;
8、能用foreach遍历访问的对象需要实现?
答:需要实现IEnumerable接口和GetEnumerator()方法。
9、C#中的多态之重载与重写
答:(1)、重载是同一个方法名在一个类中有多进行定义
////// 无参无返回值 /// public void Add(){ } /// /// 有参无返回值 /// /// Name. public void Add(string name ){ } /// /// 有参有返回值 /// /// The add. /// Name. /// Age. public int Add(string name,int age){ return 0; }
(2)、重写是指同一个虚方法(即用关键字virtual进行修饰的方法)在派生类中使用override关键字进行对该方法的重新实现
用法:
1 ///2 /// 父类A 3 /// 4 public class A 5 { 6 /// 7 /// 使用关键字virtual实现虚方法 Add 8 /// 9 /// Name. 10 public virtual void Add(string name) 11 { 12 Console.WriteLine($"成功添加了{name}"); 13 } 14 } 15 /// 16 /// 派生类B(子类) 17 /// 18 public class B : A 19 { 20 /// 21 /// 使用关键字override重新Add方法的内部实现, 22 /// 多加了个for循环, 23 /// 当然你还可以做别的逻辑实现 24 /// 25 /// Name. 26 public override void Add(string name) 27 { 28 for (int i = 0; i < 10; i++) 29 { 30 Console.WriteLine(i); 31 } 32 Console.WriteLine($"成功添加了{name}"); 33 } 34 }
10、抽象类与抽象方法,抽象的关键字abstract
答:
抽象类:
(1)、抽象类可以继承抽象类,但是继承后还是抽象类。
(2)、抽象类不可以进行实例化。
(3)、抽象类只能作为基类。
(4)、抽象类不可以密封关键字 sealed进行密封,即抽象类不可密封。
抽象方法:
(1)、抽象方法只能定义在抽象类中。
(2)、抽象方法是隐式的虚方法( virtual),且不提供也不可以有具体的实现
用法:
1 ///2 /// 抽象类 3 /// 4 public abstract class TestAbstrat 5 { 6 /// 7 /// 普通方法,可以有具体的实现 8 /// 9 void TestA() { } 10 11 /// 12 /// 抽象方法,不能有具体的实现 13 /// 14 public abstract void TestAbs(); 15 }
非抽象类继承抽象类时,如果抽象类中有抽象方法,则必须实现抽象类中定义的所有抽象方法。
1 public class TestB : TestAbstrat 2 { 3 protected TestB() 4 { 5 } 6 7 ///8 /// 必须重写抽象类TestAbstrat中的抽象方法TestAbs,TestA方法可以直接继承使用,不用重写 9 /// 10 public override void TestAbs() 11 { 12 // do some thing ... ... 13 for (int i = 0; i < 10; i++) 14 { 15 Console.WriteLine($"Count:{i}"); 16 } 17 } 18 }