zoukankan      html  css  js  c++  java
  • 补充下.net知识

    问题1:

     public int getvalue(int a)
            {
                try
                {
                    a = a + 1;
                    return a = a + 2;
                }
                catch (Exception)
                {
                    throw;
                }
                finally
                {
                    a = a + 50;
                }
    
            }

     int a = getvalue(3); 

    a的值是多少呢? 一般一定认为:finally是一定执行的,所以答案是56 

    但是实际是 retun 比 finally 先执行

    所以答案是6

    2.new 有几种用法

    三种用法如下:
    在 C# 中,new 关键字可用作运算符、修饰符或约束。
    1new 运算符:用于创建对象和调用构造函数。这种大家都比较熟悉,没什么好说的了。
    2new 修饰符:在用作修饰符时,new 关键字可以显式隐藏从基类继承的成员。
    3new 约束:用于在泛型声明中约束可能用作类型参数的参数的类型。 
     
    关于第二种用法看下例:
    using System;
    namespace ConsoleApplication1
    {
        public class BaseA
        {
            public int x = 1;
            public void Invoke()
            {
                Console.WriteLine(x.ToString());
            }
            public int TrueValue
            {
                get { return x; }
                set { x = value; }
            }
        }
        public class DerivedB : BaseA
        {
            new public int x = 2;
            new public void Invoke()
            {
                Console.WriteLine(x.ToString());
            }
            new public int TrueValue
            {
                get { return x; }
                set { x = value; }
            }
        }
     
        class Test
        {
            static void Main(string[] args)
            {
                DerivedB b = new DerivedB();
                b.Invoke();//调用DerivedB的Invoke方法,输出:2
                Console.WriteLine(b.x.ToString());//输出DerivedB的成员x值:2
                BaseA a = b;
                a.Invoke();//调用BaseA的Invoke方法,输出:1
                a.TrueValue = 3;//调用BaseA的属性TrueValue,修改BaseA的成员x的值
                Console.WriteLine(a.x.ToString());//输出BaseA的成员x的值:3
                Console.WriteLine(b.TrueValue.ToString());//输出DerivedB的成员x的值,仍然是:1
    //可见,要想访问被隐藏的基类的成员变量、属性或方法,办法就是将子类造型为父类,然
    //后通过基类访问被隐藏的成员变量、属性或方法。
            }
         }
    }
     
    new约束指定泛型类声明中的任何类型参数都必须具有公共的无参数构造函数.请看下例:
    using System;
    using System.Collections.Generic;
     
    namespace ConsoleApplication2
    {
        public class Employee
        {
            private string name;
            private int id;
     
            public Employee()
            {
                name = "Temp";
                id = 0;
            }
     
            public Employee(string s, int i)
            {
                name = s;
                id = i;
            }
     
            public string Name
            {
                get { return name; }
                set { name = value; }
            }
     
            public int ID
            {
                get { return id; }
                set { id = value; }
            }
        }
     
        class ItemFactory<T> where T : new()
        {
            public T GetNewItem()
            {
                return new T();
            }
        }
     
        public class Test
        {
            public static void Main()
            {
                ItemFactory<Employee> EmployeeFactory = new ItemFactory<Employee>();
                ////此处编译器会检查Employee是否具有公有的无参构造函数。
                //若没有则会有The Employee must have a public parameterless constructor 错误。
                Console.WriteLine("{0}'ID is {1}.", EmployeeFactory.GetNewItem().Name, EmployeeFactory.GetNewItem().ID);
            }
        }
    }
     
     
    见MSDN上关于New的解释
    new 修饰符(C# 参考)
     
    在用作修饰符时,new 关键字可以显式隐藏从基类继承的成员。 隐藏继承的成员时,该成员的派生版本将替换基类版本。 虽然可以在不使用 new 修饰符的情况下隐藏成员,但会生成警告。 如果使用 new 显式隐藏成员,则会取消此警告,并记录要替换为派生版本这一事实。
    
    若要隐藏继承的成员,请使用相同名称在派生类中声明该成员,并使用 new 修饰符修饰该成员。 例如:
    
    public class BaseC
    {
        public int x;
        public void Invoke() { }
    }
    public class DerivedC : BaseC
    {
        new public void Invoke() { }
    }
    
    在此示例中,DerivedC.Invoke 隐藏了 BaseC.Invoke。 字段 x 不受影响,因为它没有被类似名称的字段隐藏。
    
    通过继承隐藏名称采用下列形式之一:
    
    引入类或结构中的常数、指定、属性或类型隐藏具有相同名称的所有基类成员。
    
    引入类或结构中的方法隐藏基类中具有相同名称的属性、字段和类型。 同时也隐藏具有相同签名的所有基类方法。
    
    引入类或结构中的索引器将隐藏具有相同名称的所有基类索引器。
    
    对同一成员同时使用 newoverride 是错误的做法,因为这两个修饰符的含义互斥。 new 修饰符会用同样的名称创建一个新成员并使原始成员变为隐藏的。 override 修饰符会扩展继承成员的实现。
    
    在不隐藏继承成员的声明中使用 new 修饰符将会生成警告。
    
    示例
    
     
    在该例中,基类 BaseC 和派生类 DerivedC 使用相同的字段名 x,从而隐藏了继承字段的值。 该示例演示了 new 修饰符的用法。 另外还演示了如何使用完全限定名访问基类的隐藏成员。
    
    public class BaseC
    {
        public static int x = 55;
        public static int y = 22;
    }
    
    public class DerivedC : BaseC
    {
        // Hide field 'x'.
        new public static int x = 100;
    
        static void Main()
        {
            // Display the new value of x:
            Console.WriteLine(x);
    
            // Display the hidden value of x:
            Console.WriteLine(BaseC.x);
    
            // Display the unhidden member y:
            Console.WriteLine(y);
        }
    }
    /*
    Output:
    100
    55
    22
    */
     
    
    在此示例中,嵌套类隐藏了基类中同名的类。 此示例演示了如何使用 new 修饰符来消除警告消息,以及如何使用完全限定名来访问隐藏的类成员。
    
     public class BaseC 
    {
        public class NestedC 
        {
            public int x = 200;
            public int y;
        }
    }
    
    public class DerivedC : BaseC { // Nested type hiding the base type members.
        new public class NestedC   
        {
            public int x = 100;
            public int y; 
            public int z;
        }
    
        static void Main() 
        {
            // Creating an object from the overlapping class:
            NestedC c1  = new NestedC();
    
            // Creating an object from the hidden class:
            BaseC.NestedC c2 = new BaseC.NestedC();
    
            Console.WriteLine(c1.x);
            Console.WriteLine(c2.x);   
        }
    }
    /*
    Output:
    100
    200
    */

    3.varchar和nvarchar分别最大长度是多少,区别是什么

    1.nvarchar(n) : 包含 n 个字符的可变长度 Unicode 字符数据。n 的值必须介于 1 与 4,000 之间。字节的存储大小是所输入字符个数的两倍。所输入的数据字符长度可以为零。 
    2.varchar[(n)]: 长度为 n 个字节的可变长度且非 Unicode 的字符数据。n 必须是一个介于 1 和 8,000 之间的数值。存储大小为输入数据的字节的实际长度,而不是 n 个字节。所输入的数据字符长度可以为零。
    2、区别:
    1.从存储方式上,nvarchar是按字符存储的,而 varchar是按字节存储的;
    2.从存储量上考虑, varchar比较节省空间,因为存储大小为字节的实际长度,而 nvarchar是双字节存储;
    3.在使用上,如果存储内容都是英文字符而没有汉字等其他语言符号,建议使用varchar;含有汉字的使用nvarchar,因为nvarchar是使用Unicode编码,即统一的字符编码标准,会减少乱码的出现几率;
    4.如果你做的项目可能涉及不同语言之间的转换,建议用nvarchar。

    4.数据库的页是什么概念

    。对于SQL Server来说,每一个文件都是一长串的bytes.SQL Server逻辑上(仅仅是逻辑上,不是物理上)把这个文件分成N多8K大小的块。这个块就是所谓的页。数据库文件第一个8K的块就是页#0,下一个8K的块就是页#1,依此类推。页是IO读取的最小单元,SQL Server每一个IO读写都涉及一个页,当然了,对于多个物理上连续的页,SQL Server也可以用一个IO全部完成

    具体有篇文章:http://www.cnblogs.com/CareySon/archive/2012/09/07/2674503.html

    5.事务在更新的时候,其他表能不能读取,答案是根据事务级别来确定,不同的级别,不同的效果,有得会产生脏读,有得会照成死锁

    具体有篇文章:http://blog.csdn.net/dinglang_2009/article/details/7204253

    http://www.cnblogs.com/qanholas/archive/2012/05/02/2479340.html

  • 相关阅读:
    file is universal (3 slices) but does not contain a(n) armv7s slice error for static libraries on iOS
    WebImageButton does not change images after being enabled in Javascript
    ajax OPTION
    编程遍历页面上所有TextBox控件并给它赋值为string.Empty?
    获取海洋天气预报
    C#线程系列教程(1):BeginInvoke和EndInvoke方法
    js控制只能输入数字和小数点
    Response.AddHeader(,)
    ManualResetEvent的理解
    Convert.ToInt32、int.Parse(Int32.Parse)、int.TryParse、(int) 区别
  • 原文地址:https://www.cnblogs.com/linyijia/p/4763811.html
Copyright © 2011-2022 走看看