zoukankan      html  css  js  c++  java
  • 面试宝典

    http://www.jobui.com/mianshiti/it/net/  .net面试题集锦
    a=10,b=15,在不用第三方变量的前提下,把a,b的值互换
    a=a+b;
    b=a-b;
    a=a-b;
    还有变态要求,需要代码最短呢。有两个结果:
    a=b+(b=a)*0; // 11个字节  1个汉字等于2个字节
     
    正常的执行结果1 3
    //当try中有return时,先显示3 然后才会retrun;
    protected void Page_Load(object sender, EventArgs e)
        {
            try
            {
                Response.Write(1);
                return;
            }
            catch (Exception ex)
            {
                Response.Write(2);
            }
            finally
            {
                Response.Write(3);
            }
        }
     运行结果123
     protected void Page_Load(object sender, EventArgs e)
        {
            try
            {
                Response.Write(1);
                string a = "12a3";
                int i = Convert.ToInt32(a);
            }
            catch (Exception ex)
            {
                Response.Write(2);
                return;
            }
            finally
            {
                Response.Write(3);
            }
        }
    session喜欢丢值且占内存,Cookis不安全,请问用什么办法代替这两种原始的方法

    列举ASP.NET 页面之间传递值的几种方式。
      1  ASP.NET页面之间传递值的几种方式
      2 
      3   页面传值是学习asp.net初期都会面临的一个问题,总的来说有页面传值、存储对象传值、ajax、类、model、表单等。但是一般来说,常用的较简单有QueryString,Session,Cookies,Application,Server.Transfer。
      4 
      5  
      6 
      7   一、QueryString
      8 
      9   QueryString是一种非常简单的传值方式,他可以将传送的值显示在浏览器的地址栏中。如果是传递一个或多个安全性要求不高或是结构简单的数值时,可以使用这个方法。但是对于传递数组或对象的话,就不能用这个方法了。
     10 
     11   这种方法的优点:1.使用简单,对于安全性要求不高时传递数字或是文本值非常有效。
     12   这种方法的缺点:1.缺乏安全性,由于它的值暴露在浏览器的URL地址中的。
     13           2.不能传递对象。
     14 
     15   使用方法:1.在源页面的代码中用需要传递的名称和值构造URL地址。
     16        2.在源页面的代码用Response.Redirect(URL);重定向到上面的URL地址中。
     17        3.在目的页面的代码使用Request.QueryString["name"];取出URL地址中传递的值。
     18 
     19   例子:(1)a.aspx
     20 
     21 private void Button1_Click(object sender, System.EventArgs e) 
     22 { 
     23   string s_url; 
     24   s_url = "b.aspx?name=" + Label1.Text; 
     25   Response.Redirect(s_url); 
     26 }
     27 
     28   (2)b.aspx
     29 
     30 private void Page_Load(object sender, EventArgs e) 
     31 { 
     32   Label2.Text = Request.QueryString["name"]; 
     33 }
     34 
     35  
     36 
     37   二、Session
     38 
     39   想必这个肯定是大家使用中最常见的用法了,其操作与Application类似,作用于用户个人,所以,过量的存储会导致服务器内存资源的耗尽。
     40 
     41   优点:1.使用简单,不仅能传递简单数据类型,还能传递对象。
     42      2.数据量大小是不限制的。
     43 
     44   缺点:1.在Session变量存储大量的数据会消耗较多的服务器资源。
     45 
     46      2.容易丢失。
     47 
     48   使用方法:1.在源页面的代码中创建你需要传递的名称和值构造Session变量:Session["Name"]="Value(Or Object)";
     49 
     50        2.在目的页面的代码使用Session变量取出传递的值。Result = Session["Nmae"]
     51 
     52   注意:session不用时可以销毁它,销毁的方法是:清除一个:Session.Remove("session名");
     53 
     54                          清除所有:Session.Clear();
     55 
     56   例子:(1)a.aspx
     57 
     58 private void Button1_Click(object sender, System.EventArgs e) 
     59 { 
     60   Session["name"] = Label.Text; 
     61 }
     62 
     63   (2)b.aspx
     64 
     65 private void Page_Load(object sender, EventArgs e) 
     66 { 
     67   string name; 
     68   name = Session["name"].ToString(); 
     69 }
     70 
     71  
     72 
     73   三、Cookie
     74 
     75   这个也是大家常使用的方法,Cookie用于在用户浏览器上存储小块的信息,保存用户的相关信息,比如用户访问某网站时用户的ID,用户的偏好等,用户下次访问就可以通过检索获得以前的信息。所以Cookie也可以在页面间传递值。Cookie通过HTTP头在浏览器和服务器之间来回传递的。Cookie只能包含字符串的值,如果想在Cookie存储整数值,那么需要先转换为字符串的形式。
     76 
     77   与Session一样,其是什对每一个用户而言的,但是有个本质的区别,即Cookie是存放在客户端的,而session是存放在服务器端的。而且Cookie的使用要配合ASP.NET内置对象Request来使用。
     78 
     79   优点:1.使用简单,是保持用户状态的一种非常常用的方法。比如在购物网站中用户跨多个页面表单时可以用它来保持用户状态。
     80 
     81   缺点:1.常常被人认为用来收集用户隐私而遭到批评。
     82 
     83      2.安全性不高,容易伪造。
     84 
     85   
     86 
     87   使用方法:1.在源页面的代码中创建你需要传递的名称和值构造Cookie对象:
     88 
     89 HttpCookie objCookie = new HttpCookie("myCookie","Hello,Cookie!");
     90 Response.Cookies.Add(cookie); 
     91 
     92       2.在目的页面的代码使用Cookie对象取出传递的值:Result = Request.Cookies[ "myCookie" ].Value;
     93 
     94   例子:(1)a.aspx
     95 
     96 private void Button1_Click(object sender, System.EventArgs e)
     97 {
     98   HttpCookie objCookie = new HttpCookie("myCookie","Hello,Cookie!");
     99   Response.Cookies.Add(objCookie); 
    100 }
    101 
    102   (2)b.aspx
    103 
    104 string myName1Value;
    105 myName1Value = Request.Cookies[ "myCookie" ].Value;
    106 
    107  
    108 
    109   四、Application
    110 
    111   Application对象的作用范围是整个全局,也就是说对所有用户都有效。它在整个应用程序生命周期中都是有效的,类似于使用全局变量一样,所以可以在不同页面中对它进行存取。它和Session变量的区别在于,前者是所有的用户共用的全局变量,后者是各个用户独有的全局变量。
    112 
    113   可能有人会问,既然所有用户都可以使用application变量,那他可以用在什么场合呢?这里举个例子:网站访问数。多个请求访问时都可以对它进行操作。
    114 
    115   优点:1.使用简单,消耗较少的服务器资源。
    116 
    117      2.不仅能传递简单数据,还能传递对象。
    118 
    119      3.数据量大小是不限制的。
    120 
    121   缺点:1.作为全局变量容易被误操作。所以单个用户使用的变量一般不能用application。
    122 
    123   使用方法:1.在源页面的代码中创建你需要传递的名称和值构造Application变量:Application["Nmae"]="Value(Or Object)";
    124 
    125        2.在目的页面的代码使用Application变量取出传递的值。Result = Application["Nmae"]
    126 
    127   注意:常用lock和unlock方法用来锁定和解锁,为了防止并发修改。
    128 
    129   例子:(1)a.aspx
    130 
    131 private void Button1_Click(object sender, System.EventArgs e) 
    132 { 
    133   Application["name"] = Label1.Text; 
    134 }
    135 
    136   (2)b.aspx
    137 复制代码
    138 
    139 private void Page_Load(object sender, EventArgs e) 
    140 { 
    141   string name; 
    142   Application.Lock(); 
    143   name = Application["name"].ToString(); 
    144   Application.UnLock(); 
    145 }
    146 
    147 复制代码
    148 
    149  
    150 
    151   五、Server.Transfer
    152 
    153   这个才可以说是面象对象开发所使用的方法,其使用Server.Transfer方法把流程从当前页面引导到另一个页面中,新的页面使用前一个页面的应答流,所以这个方法是完全面象对象的,简洁有效。
    154 
    155   Server.Transfer是从当前的ASPX页面转到新的ASPX页面,服务器端执行新页并输出,在新页面中通过Context.Handler来获得前一个页面传递的各种数据类型的值、表单数据、QueryString.由于重定向完全在服务器端完成,所以客户端浏览器中的URL地址是不会改变的。调用Server.Transfer时,当前的ASPX页面终止执行,执行流程转入另一个ASPX页面,但新的ASPX页面仍使用前一ASPX页面创建的应答流。
    156 
    157   ps:比较Server.Transfer和Response.Redirect的区别。
    158     (1)Server.Transfer在服务器端完成,所以客户端浏览器中的URL地址是不会改变的;Response.Redirect是客户端完成,向服务器端提出新的页面处理请求,所以客户端浏览器中的URL地址是会改变的。
    159     (2)Server.Transfer在服务器端完成,不需要客户端提出请求,减少了客户端对服务器端提出请求。[2]
    160     (3)Server.Transfer只能够转跳到本地虚拟目录指定的页面,也就是工程项目中的页面,而Response.Redirect则十分灵活,可以跳转到任何URL地址。
    161     (4)Server.Transfer可以将前一个页面的各种类型的值传到新的页面;Response.Redirect则只能借助URL中带参数或是结合上面四种办法把各种类型的值传到新的页面。
    162 
    163   优点:1.直接在服务器端重定向,使用简单方便,减少了客户端对服务器端提出请求。
    164 
    165      2.可以传递各种数据类型的值和控件的值。
    166 
    167   缺点:1.客户端浏览器中的URL地址是不改变,会导致在新的页面可能出现一些意想不到的问题。比如如果源页面和目的页面不在同一个虚拟目录或其子目录下,那么使用相对路径的图片、超链接都会导致错误的指向。
    168 
    169   使用方法:1.在源页面的代码中,使用Page类的Server.Transfer跳到另一个页面传递页面数据:Server.Transfer("b.aspx","false")。
    170 
    171        2.在目的页面中,使用Context.Handler来接收数据:FormerPage formerPage = (FormerPage)Context.Handler; 然后用formerPage的属性和方法来获取前一个页面的值,或者直接用Context.Items["myParameter "]
    172 
    173   例子:(1)a.aspx
    174 复制代码
    175 
    176 public string Name 
    177 { 
    178   get{ return Label1.Text;} 
    179 } 
    180 private void Button1_Click(object sender, System.EventArgs e) 
    181 { 
    182   Server.Transfer("b.aspx"); 
    183 }
    184 
    185 复制代码
    186 
    187     (2)b.aspx
    188 复制代码
    189 
    190 private void Page_Load(object sender, EventArgs e) 
    191 { 
    192   a newWeb; //实例a窗体 
    193   newWeb = (source)Context.Handler; 
    194   string name; 
    195   name = newWeb.Name; 
    196 }
    197 
    198 复制代码
    199 
    200  
    201 
    202   以上就是常用的几种页面间传值的方法,我一般使用session和querystring来传值,少数情况会使用到cookie。本篇文章仅仅是介绍这几种方法的使用方法,内部原理没有过多的解释,关于session的存储方式请参见:session的存储方式和配置
    View Code

    C#中的委托是什么?事件是不是一种委托?

     委托可以把一个方法作为参数代入另一个方法。

     委托可以理解为指向一个函数的引用。

     是,是一种特殊的委托

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    using System;
    using System.Collections.Generic;
    using System.Text;
    namespace Delegate
    {
    //定义委托,它定义了可以代表的方法的类型
    public delegate void GreetingDelegate(string name);
    class Program
    {
    private static void EnglishGreeting(string name)
    {
    Console.WriteLine("Morning, " + name);
    }
    private static void ChineseGreeting(string name)
    {
    Console.WriteLine("早上好, " + name);
    }
    //注意此方法,它接受一个GreetingDelegate类型的参数,该参数是返回值为空,参数为string类型的方法
    private static void GreetPeople(string name, GreetingDelegate MakeGreeting)
    {
    MakeGreeting(name);
    }
    static void Main(string[] args)
    {
    GreetPeople("Jimmy Zhang", EnglishGreeting);
    GreetPeople("张子阳", ChineseGreeting);
    Console.ReadKey();
    }
    }
    }
    输出如下:
    Morning, Jimmy Zhang
    早上好, 张子阳
    我们对委托做一个总结:
    委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。
    1
    2
    3
    4
    5
    6
    7
    8
    static void Main(string[] args) {
    GreetingDelegate delegate1;
    delegate1 = EnglishGreeting; // 先给委托类型的变量赋值
    delegate1 += ChineseGreeting; // 给此委托变量再绑定一个方法
    // 将先后调用 EnglishGreeting 与 ChineseGreeting 方法
    GreetPeople("Jimmy Zhang", delegate1);
    Console.ReadKey();
    }
    输出为:
    Morning, Jimmy Zhang
    早上好, Jimmy Zhang
    委托事件的例子(锅烧水的例子)
    我们之前已经对委托和事件介绍很多了,写代码应该很容易了,在这里直接给出代码,并在注释中加以说明。
    observer模式: 定义对象间的一对多的依赖关系
    Observe  观察者角色
    Observable  被观察目标(subject)角色
    该实例模拟了烧水的过程,涉及三个对象,Heater(热水器),Display(显示器),Alarm(报警器).
    模拟过程:为了便于运行,水的初始化温度为90,沸点为95,显示器依据热水器显示温度,显示器显示温度为95时, 报警器开始报警。
    明显可以看出Heater是subject ,
    Display 是它的 Obsrver,
    同时Display亦是subject,因为它要被报警器观察,所以Alarm是Display的Observer.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    using System;
    using System.Collections.Generic;
    using System.Text;
    namespace Delegate {
    // 热水器
    public class Heater {
    private int temperature;
    public delegate void BoilHandler(int param); //声明委托
    public event BoilHandler BoilEvent; //声明事件
    // 烧水
    public void BoilWater() {
    for (int i = 0; i <= 100; i++) {
    temperature = i;
    if (temperature > 95) {
    if (BoilEvent != null) { //如果有对象注册
    BoilEvent(temperature); //调用所有注册对象的方法
    }
    }
    }
    }
    }
    // 警报器
    public class Alarm {
    public void MakeAlert(int param) {
    Console.WriteLine("Alarm:嘀嘀嘀,水已经 {0} 度了:", param);
    }
    }
    // 显示器
    public class Display {
    public static void ShowMsg(int param) { //静态方法
    Console.WriteLine("Display:水快烧开了,当前温度:{0}度。", param);
    }
    }
    class Program {
    static void Main() {
    Heater heater = new Heater();
    Alarm alarm = new Alarm();
    heater.BoilEvent += alarm.MakeAlert; //注册方法
    heater.BoilEvent += (new Alarm()).MakeAlert; //给匿名对象注册方法
    heater.BoilEvent += Display.ShowMsg; //注册静态方法
    heater.BoilWater(); //烧水,会自动调用注册过对象的方法
    }
    }
    }
    输出为:
    Alarm:嘀嘀嘀,水已经 96 度了:
    Alarm:嘀嘀嘀,水已经 96 度了:
    Display:水快烧开了,当前温度:96度。
     

    override与重载的区别

    override 与重载的区别。重载是方法的名称相同。参数或参数类型不同,进行多次重载以适应不同的需要,实现多态.

    Override 是进行基类中函数的重写,实现多态.

    重载是平行的,重写是垂直的.

    请编程遍历页面上所有TextBox控件并给它赋值为string.Empty

    在winform中

    foreach (System.Windows.Forms.Control control in this.Controls)

    {

        if (control is System.Windows.Forms.TextBox)

        {

        System.Windows.Forms.TextBox tb = (System.Windows.Forms.TextBox)control ;

        tb.Text = String.Empty ;

        }

    }

    什么是装箱和拆箱?

    从值类型接口转换到引用类型装箱。从引用类型转换到值类型拆箱。

    托管代码是运行.NET 公共语言运行时CLR的代码 unsafe:非托管代码。不经过CLR运行。

    非托管代码(Unmanaged Code)不由CLR公共语言运行库执行,而是由操作系统直接执行的代码。

    ASP.net的身份验证方式有哪些?分别是什么原理?

    Windwos(默认)用IIS控制

    From(窗体)用帐户

    Passport(密钥)

    在C#中,string str = null 与 string str = “” 请尽量使用文字或图象说明其中的区别

    string str = null 是不给他分配内存空间,而string str = "" 给它分配长度为空字符串的内存空间。

    请详述在dotnet中类(class)与结构(struct)的异同?

    class可以被实例化,属于引用类型,class可以实现接口和单继承其他类,还可以作为基类型,是分配在内存的堆上的

    struct属于值类型,不能作为基类型,但是可以实现接口,是分配在内存的栈上的.

    string strTmp = "abcdefg某某某";

    int i= System.Text.Encoding.Default.GetBytes(strTmp).Length;

    int j= strTmp.Length;

    以上代码执行完后,i= j=

    i=13,j=10

    能用foreach遍历访问的对象需要实现 __IEnumerable__接口或声明__GetEnumerator_方法的类型。

    能够进行foreach的类型结构,都必须实现IEnumerable接口。

    IEnumerable接口,有一个GetEnumerator的方法,返回一个实现IEnumerator接口的对象。

    IEnumerator接口,有Current只读属性,MoveNext方法,Reset方法。

    比如类型结构 TestForeach 一个对象tf ,在进行foreach的时候,比如如下:

    foreach(var a in tf){

    console.writeLine(a.toString());

    }
    程序运行到var a in tf时,实际上,调用了TestForeach的GetEnumerator()方法,返回一个a,当运行完console.writeLine(a.toString());
    后,继续运行 var a in tf,其实是调用了 上一次的a.MoveNext()放法,直到a.MoveNext=false
    foreach运行完毕。

    如果一个类不与具体的事物相联系,而只是表达一种抽象的概念,仅仅是作为其派生类的一个基类,这样的类就是抽象类,在抽象类中声明方法时,如果加上abstract时就是抽象方法

    1.抽象类概述及声明

    抽象类与非抽象类的主要区别:

    ·抽象类不能直接被实例化

    ·抽象类中可以包含抽象成员,但非抽象类中不可以

    ·抽象类不能被密封

    举个小例子

    public abstract class oneClass

    {

      public int i;

      public void denylau()

      {

      }

    }

    2.抽象方法概述及声明

    声明抽象方法时需注意:·抽象方法必须声明在抽象类中  ·声明抽象方法时,不能使用virtual、static、private修饰符。

    在抽象类中抽象方法不提供实现。

    如:

    public abstract class myTestClass()

    {

      public abstract void method();

    }

    3.抽象类与抽象方法的使用

    直接举例子,讲解例子喽!

    using System;
    using System.Collections.Generic;
    using System.Text;

    namespace _
    {
        public abstract class myClass
        {
            private string id = "";
            private string name = "";
            /// <summary>
            /// 编号属性及实现
            /// </summary>
            public string ID
            {
                get
                {
                    return id;
                }
                set
                {
                    id = value;
                }
            }
            /// <summary>
            /// 姓名属性及实现
            /// </summary>
            public string Name
            {
                get
                {
                    return name;
                }
                set
                {
                    name = value;
                }
            }
            /// <summary>
            /// 抽象方法,用来输出信息
            /// </summary>
            public abstract void ShowInfo();
        }
        public class DriveClass:myClass                     //继承抽象类
        {
            /// <summary>
            /// 重写抽象类中输出信息的方法
            /// </summary>
            public override void ShowInfo()
            {
                Console.WriteLine(ID + " " + Name);
            }
        }
        class Program
        {
            static void Main(string[] args)
            {
                DriveClass driveclass = new DriveClass();   //实例化派生类
                myClass myclass = driveclass;               //使用派生类对象实例化抽象类
                myclass.ID = "BH0001";                      //使用抽象类对象访问抽象类中的编号属性
                myclass.Name = "TM";                        //使用抽象类对象访问抽象类中的姓名属性
                myclass.ShowInfo();                         //使用抽象类对象调用抽象类中的的抽象方法
            }
        }
    }

    上例中通过派生类的对象driveclass来实例化抽象类,然后使用抽象类访问抽象类中的属性及方法。

    上面这个小例子,细心的朋友会发现,怎么抽象类和我们上一篇文章讲的接口差不多吗?那么究竟抽象类和接口存在哪些区别呢?

    Ok,下面就介绍下抽象类和接口的区别喽:

    ·它们的派生类只能继承一个基类,即只能继承一个抽象类,但是可以继承多个接口。

    ·抽象类中可以定义成员的实现,但接口中不可以。

    ·抽象类中包含字段、构造函数、析构函数、静态成员或常量等,接口中不可以。

    ·抽象类中的成员可以私有的(只要不是抽象的)、受保护的、内部的或受保护的内部成员,但接口中的成员必须是公共的。

    PS:抽象类和接口这两种类型用于完全不同的目的。抽象类主要用作对象系列的基类,共享某些主要特性,例如共同的目的和结构。接口则主要用于类,这些类在基础水平上有所不同,但仍然可以完成某些相同的任务。

    http://home.cnblogs.com/u/ArmyShen/ 可以去学习 这个是ArmyShen的博客园

    EGG:这是实验的一个例子
    using System.Text;
    using System.Threading.Tasks;

    namespace ConsoleApplication5
    {
       public abstract class a
        {
            public int i = 0;
            public string abcdefg()
            {
                return "HELLO,你好!";
            }

            public abstract void abcd();

            public virtual string efg()
            {
                return i.ToString();
            }

            public virtual void eat()
            {
             
            }
        }
    }
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;

    namespace ConsoleApplication5
    {
       public class b:a
        {
            public override void abcd()
            {
                Console.WriteLine("abcd");
                Console.ReadKey();
            }

            public override void eat()
            {
                Console.WriteLine("try");
            }

            public override string efg()
            {
                return "虛方法重寫需要自己手動添加!";
            }
        }
    }
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;

    namespace ConsoleApplication5
    {
        class Program
        {
            static void Main(string[] args)
            {
                b ab = new b();
                Console.WriteLine(ab.abcdefg());
                Console.WriteLine(ab.efg());
                ab.eat();
                ab.abcd();
            }
        }
    }
    运行效果:
    HELLO,你好!
    虚方法重写需要自己手动添加!
    try
    abcd

    接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)?

    接口可以继承接口

    抽象类可以实现(implements)接口

    抽象类是否可继承实体类,但前提是实体类必须有明确的构造函数 (抽象类与一般类唯一的不同,就是它可以含有抽象成员,它本身不可实例化。除此以外,没有其他区别)

    是否可以继承String类?

    String类是密封类故不可以继承

    try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?

    会执行,在return前执行(验证过的)

    数组有没有length()这个方法? String有没有length()这个方法?

    数组没有length()这个方法,有length的属性。String没有length()这个方法,有length属性

    如何处理几十万条并发数据?

    用存储过程或事务

    Session有什么重大BUG,微软提出了什么方法加以解决?

    是iis中由于有进程回收机制,系统繁忙的话Session会丢失,可以用Sate   server或SQL   Server数据库的方式存储Session不过这种方式比较慢,而且无法捕获Session的END事件

    产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复。

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;

    namespace ConsoleApplication5
    {
        class Program
        {
            static void Main(string[] args)
            {
                int[] str = new int[100];
                ArrayList al = new ArrayList();//寫法一
                List<int> ls = new List<int>();//寫法二
                while (al.Count < 100)
                {
                    Random rd = new Random();
                    int i = rd.Next(0, 101);
                    if (!al.Contains(i))
                    {
                        al.Add(i);
                    }
                }
                while (ls.Count < 100)
                {
                    Random rd = new Random();
                    int i= rd.Next(0, 101);
                    if (ls.Contains(i))
                    {
                        ls.Add(i);
                    }
                }
                for (int j = 0; j < 100; j++)
                {
                 str[j]=(int)al[j];
                }
                for (int j = 0; j < 100; j++)
                {
                    str[j] = (int)ls[j];
                }
            }
        }
    }
    软件开发过程一般有几个阶段?每个阶段的作用?

    可行性分析(风险控制),需求分析,架构设计,代码编写,测试,部署,维护

    需要实现对一个字符串的处理,首先将该字符串首尾的空格去掉,如果字符串中间还有连续空格的话,仅保留一个空格,即允许字符串中间有多个空格,但连续的空格数不可超过一个

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Text.RegularExpressions;
    using System.Threading.Tasks;

    namespace ConsoleApplication5
    {
        class Program
        {
            static void Main(string[] args)
            {
                string str = " abc   def ";
                Console.WriteLine(str.Trim());//abc   def
                Console.WriteLine(str.Trim().Length);//9
                Console.WriteLine(str.Length);//11
                Console.WriteLine(Regex.Replace(str.Trim()," +"," "));//在正則中*表示0個或者多個   +表示一個或者多個
                Console.WriteLine(Regex.Replace(str.Trim()," +"," ").Length);//7
                Console.ReadKey();
            }
        }
    }

    XML可扩展性语言

    const不能用static修饰。

    在Asp.net中所有的自定义用户控件都必须继承自__Control_

    62-63=1 等式不成立,请移动一个数字(不可以移动减号和等于号),使得等式成立,如何移动

    62移动成2的6次方

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Text.RegularExpressions;
    using System.Threading.Tasks;

    namespace ConsoleApplication5
    {
        class Program
        {
            static void Main(string[] args)
            {
                int i = 5;
                int j = 5;
                string x = "abc";
                string y = "abc";
                if (object.Equals(i, j))
                {
                    Console.WriteLine("1true");
                }
                if (object.ReferenceEquals(i,j))
                {
                    Console.WriteLine("2true");
                }
                if (object.Equals(x, y))
                {
                    Console.WriteLine("3true");
                }
                if (object.ReferenceEquals(x,y))
                {
                    Console.WriteLine("4true");
                }
                Console.ReadKey();
            }
        }
    }

    运行结果1 3 4

    写一个HTML页面,实现以下功能,左键点击页面时显示“您好”,右键点击时显示“禁止右键”。并在2分钟后自动关闭页面

    <script language=javascript>

     setTimeout('window.close();',3000);

     function show()

     {

      if (window.event.button == 1)

      {

       alert("左");

      }

      else if (window.event.button == 2)

      {

       alert("右");

      }

     }

    </script>

    <%# %> 和 <%  %> 有什么区别?

    <%# %>表示绑定的数据源

    <% %>是服务器端代码块

    ref和out的使用与区别

    out的使用

       class Program
        {
            static void Main(string[] args)
            {

         string tmp;    //先声明,但不初始化

         User _user=new User();      

         _user.Name(out tmp);        //调用Name方法

                  Console.WriteLine("{0}",tmp); //这时tmp的值为“在这里面赋值了”

                  Console.ReadKey(true);

       }

         }

      class User

          {

        public void Name(out string tmps)

               {

           tmps="在这里面赋值了";

               }

          }

           结果:

                  在这里面赋值了

    —————————————————————————————————————————————————

     ref的使用

    —————————————————————————————————————————————————

       class Program
        {
            static void Main(string[] args)
            {

         string tmp="传值之前";    //声明并初始化        这时如果输出tmp值为"传值之前"

              User _user=new User();

                  _user.Name(ref tmp);

                  Console.WriteLine("{0}",tmp);

                  Console.ReadKey(true);

            }

        }

        class User

        {

             public void Name(ref string tmps)

             {

                  tmps="传值之后";

             }

        }

        结果:

              传值之后

    —————————————————————————————————————————————————

    区别:

    ref和out的区别在C# 中,既可以通过值也可以通过引用传递参数。通过引用传递参数允许函数成员更改参数的值,并保持该更改。若要通过引用传递参数, 可使用ref或out关键字。ref和out这两个关键字都能够提供相似的功效,其作用也很像C中的指针变量。它们的区别是:

    1、使用ref型参数时,传入的参数必须先被初始化。对out而言,必须在方法中对其完成初始化。

    2、使用ref和out时,在方法的参数和执行方法时,都要加Ref或Out关键字。以满足匹配。

    3、out适合用在需要retrun多个返回值的地方,而ref则用在需要被调用的方法修改调用者的引用的时候。

    out

    方法参数上的 out 方法参数关键字使方法引用传递到方法的同一个变量。当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。

    当希望方法返回多个值时,声明 out 方法非常有用。使用 out 参数的方法仍然可以返回一个值。一个方法可以有一个以上的 out 参数。

    若要使用 out 参数,必须将参数作为 out 参数显式传递到方法。out 参数的值不会传递到 out 参数。

    不必初始化作为 out 参数传递的变量。然而,必须在方法返回之前为 out 参数赋值。

    属性不是变量,不能作为 out 参数传递。

    ref是    有进有出,而out是       只出不进。

    请简述一下你对WebService的了解。
    是Web服务程序,一般用于接口程序。通常是两个不同语言和不同系统之间的通信接口。
     
    索引和属性的区别

    C#索引器详解

    索引器允许类和结构的实例按照与数组相同的方式进行索引,索引器类似与属性,不同之处在于他们的访问器采用参数。被称为有参属性。

    简单的索引器实例:

    class Program
        {
            static void Main(string[] args)
            {
                IndexClass a = new IndexClass();
                a[0] = "张三";
                a[1] = "李四";
                a[2] = "王五";
                Console.WriteLine("a[0]=" + a[0]);
                Console.WriteLine("a[1]=" + a[1]);
                Console.WriteLine("a[2]=" + a[2]);
                Console.ReadKey();
            }
        }
        class IndexClass
        {
            private string[] name = new string[10];
            public string this[int index]
            {
                get { return name[index]; }
                set { this.name[index] = value; }
            }
        }

    索引器与数组的比较:

    索引器的索引值不受类型限制。用来访问数组的索引值一定是整数,而索引器可以是其他类型的索引值。

    索引器允许重载,一个类可以有多个索引器。

    索引器不是一个变量没有直接对应的数据存储地方。索引器有get和set访问器。

    索引器允许类和结构的实例按照与数组相同的方式进行索引,索引器类似与属性,不同之处在于他们的访问器采用参数。被称为有参属性。

    简单的索引器实例:

    索引器与属性的比较:

    标示方式:属性以名称来标识,索引器以函数签名来标识。

    索引器可以被重载。属性则不可以被重载。

    属性可以为静态的,索引器属于实例成员,不能被声明为static

    多参数索引器实例:

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Collections;
    namespace Study
    {
        class Program
        {
            static void Main(string[] args)
            {
                ScoreIndex s = new ScoreIndex();
                s["张三", 1] = 90;
                s["张三", 2] = 100;
                s["张三", 3] = 80;
                s["李四", 1] = 60;
                s["李四", 2] = 70;
                s["李四", 3] = 50;
                Console.WriteLine("张三课程编号为1的成绩为:" + s["张三",1]);
                Console.WriteLine("张三的所有成绩为:");
                ArrayList temp;
                temp = s["张三"];
                foreach (IndexClass b in temp)
                {
                    Console.WriteLine("姓名:" + b.Name + "课程编号:" + b.CourseID + "分数:" + b.Score);
                }
                Console.ReadKey();
            }
        }
        class IndexClass
        {
            private string _name;
            private int _courseid;
            private int _score;
            public IndexClass(string _name, int _courseid, int _score)
            {
                this._name = _name;
                this._courseid = _courseid;
                this._score = _score;
            }
            public string Name
            {
                get { return _name; }
                set { this._name = value; }
            }
            public int CourseID
            {
                get { return _courseid; }
                set { this._courseid = value; }
            }
            public int Score
            {
                get { return _score; }
                set { this._score = value; }
            }
        }
        class ScoreIndex
        {
            private ArrayList arr;
            public ScoreIndex()
            {
                arr = new ArrayList();
            }
            public int this[string _name, int _courseid]
            {
                get
                {
                    foreach (IndexClass a in arr)
                    {
                        if (a.Name == _name && a.CourseID == _courseid)
                        {
                            return a.Score;
                        }
                    }
                    return -1;
                }
                set
                {
                    arr.Add(new IndexClass(_name, _courseid, value)); //arr["张三",1]=90
                }
            }
            //重载索引器
            public ArrayList this[string _name]
            {
                get
                {
                    ArrayList temp = new ArrayList();
                    foreach (IndexClass b in arr)
                    {
                        if (b.Name == _name)
                        {
                            temp.Add(b);
                        }
                    }
                    return temp;
                }
            }
        }
    }

    备注:

    所有索引器都使用this关键词来取代方法名。Class或Struct只允许定义一个索引器,而且总是命名为this。

    索引器允许类或结构的实例按照与数组相同的方式进行索引。索引器类似于属性,不同之处在于它们的访问器采用参数。

    get 访问器返回值。set 访问器分配值。

    this 关键字用于定义索引器。

    value 关键字用于定义由 set 索引器分配的值。

    索引器不必根据整数值进行索引,由您决定如何定义特定的查找机制。

    索引器可被重载。

    索引器可以有多个形参,例如当访问二维数组时。

    索引器可以使用百数值下标,而数组只能使用整数下标:如下列定义一个String下标的索引器
    public int this [string name] {...}

    属性和索引器

    属性和索引器之间有好些差别:

    类的每一个属性都必须拥有唯一的名称,而类里定义的每一个索引器都必须拥有唯一的签名(signature)或者参数列表(这样就可以实现索引器重载)。

    属性可以是static(静态的)而索引器则必须是实例成员。

    写的例子  泛型类

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Text.RegularExpressions;
    using System.Threading.Tasks;

    namespace ConsoleApplication5
    {
        class SampleCollection<T>
        {
            private T[] arr = new T[100];
            public T this[int i]
            {
                get
                {
                    return arr[i];
                }
                set
                {
                    arr[i] = value;
                }
            }
        }
        class SampleCollectionTwo
        {
            List<string> lso = new List<string>();
            
            private string[] arr = new string[100];
            public string this[int i]
            {
                get
                {
                    return arr[i];
                }
                set
                {
                    arr[i] = value;
                }
            }
        }
        class SampleCollectionThree<T>
        {
            private T[] arr = new T[100];
            public T this[int i]
            {
                get
                {
                    return arr[i];
                }
                set
                {
                    arr[i] = value;
                }
            }
        }
        class Program
        {
            static void Main(string[] args)
            {
                SampleCollection<string> stringCollection = new SampleCollection<string>();
                stringCollection[0] = "Hello, World";
                System.Console.WriteLine(stringCollection[0]);
                Console.WriteLine("                    ");
                SampleCollectionTwo sct = new SampleCollectionTwo();
                sct[0] = "Hello Ajax";
                System.Console.WriteLine(sct[0]);
                Console.ReadKey();
            }
        }
    }

    转换数组转换为arraylist

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Text.RegularExpressions;
    using System.Threading.Tasks;

    namespace ConsoleApplication5
    {
       
        class Program
        {
            static void Main(string[] args)
            {
                //
                string[] str = new string[] {"111","222222" };
                //把數組轉化成arraylist例子一
                ArrayList al = new ArrayList(str);
                Console.WriteLine(al.Count);
                //例子二
                ArrayList alt = new ArrayList();
                alt.AddRange(str);
                Console.WriteLine(alt.Count);
                Console.ReadKey();
                //輸出2
                //輸出2
            }
        }
    }
    描述线程与进程的区别?(*

    1.线程(Thread)与进程(Process)二者都定义了某种边界,不同的是进程定义的是应用程序与应用程序之间的边界,不同的进程之间不能共享代码和数据空间,而线程定义的是代码执行堆栈和执行上下文的边界。

    2.一个进程可以包括若干个线程, 同时创建多个线程来完成某项任务,便是多线程。而同一进程中的不同线程共享代码和数据空间。用一个比喻来说,如果一个家庭代表一个进程,在家庭内部,各个 成员就是线程,家庭中的每个成员都有义务对家庭的财富进行积累,同时也有权利对家庭财富进行消费,当面对一个任务的时候,家庭也可以派出几个成员来协同完 成,而家庭之外的人则没有办法直接消费不属于自己家庭的财产。

    发送邮件

    发送邮件重要是两个类MailMessage和SmtpClient两个类

    Assembly.Load("foo.dll"); 这句话是否正确?(*

    错误,正确的应该是Assembly.Load("foo"); 或者Assembly.LoadFrom("foo.dll");

  • 相关阅读:
    括号序列
    乘积最大
    装箱问题
    开心的金明
    金明的预算方案(有依赖的背包问题)
    砝码称重
    (枚举)算法竞赛入门经典(7.1.2)最大乘积
    (枚举)算法竞赛入门经典(7.1.1)除法
    Zabbix历史数据清理
    sonarqube6.7.1使用
  • 原文地址:https://www.cnblogs.com/sdya/p/4534114.html
Copyright © 2011-2022 走看看