结构和类分别应在什么时候使用

  • struct是值类型,他可以包含数据和函数

  • struct是值类型,不需要的分配

  • struct直接将数据存储在结构中,而类存储的是对一个动态分配的对象的引用

  • struct适用于较小的数据结构

  • struct可能会影响性能(因为来回操作的话都是操作的单独的副本,而类操作的是原始对象,存储的是引用

  • 构造函数可以通过new操作符调用,但这不会在堆上分配内存

  • struct构造函数只返回struct值本身(通常是堆栈中的临时位置),而且在必要时这个值被复制。

以上是官方的解答。我认为最终要的是要认识到,struct是值类型,类是引用类型,然后清楚值类型和引用类型的区别才可以。比如存储的位置的区别了,存储的内容(一个是副本,一个是引用),多次操作对性能的影响了等等,了解了这些就清楚了何时使用值类型,何时使用引用类型.

如何解析XML文件

static void parseXML(string xmlString)
{
    StringBuilder sb = new StringBuilder();
    using(XmlReader reader = XmlReader.Create(new StringReader(xmlString)))
    {
        reader.ReadToFollowing("book");
        reader.MoveToFirstAttribute();
        string genre = reader.Value;
        sb.AppendLine("The genre value:" + genre);
        
        reader.ReadToFollowing("title");
        sb.AppendLine("Content of fitle element" + reader.ReadelementContentAsString());
    }

    Console.WriteLine(sb);
}

以上就是基本代码,比较简单。关于XmlReader类详见MSDN文档
现在好像用Linq也可以解析XML文件,还更加方便。

String和string的区别

•string 类型是一个封装的类(class)类型,它直接从对象继承。string 类的实例表示Unicode 字符串。
•string 类型的值可以被写为字符串。.
•string 关键字只是预定义的类System.String的别名,因此可以使用string name = “Fred”; 或String name = “Fred”;
•类似地,我们可以使用string.Concat() 或String.Concat()
•string 用于变量名称
•String 用于类方法和引用
以上是MVA中给出的解释,这里我更喜欢CLR via C#中提到的,string属于C#基元类型,而String属于FCL Framework类库类型,两者从本质上讲没有区别,string可以看成是String的别名,它们的区别可以看成是int和System.Int32的区别

如何在C#程序中输出程序所在路径

这里面使用到了反射,其实从代码来说是非常简单的。

string path = System.Reflection.Assembly.GetExecutingAssembly().Location;
Console.WriteLine(System.IO.Path.GetDirectioryName(path));

关于反射明天回从CLR via C#中讲一些

在 C# 中调用基类构造函数

在C#中调用父类基本的构造函数是很简单的

public BaseClass()
{
    public string _name = "" ;
    public BaseClass(string name)
    {
        _name = name;
    }

    public 
}


//子类
public InheritTest : BaseClass
{    
    //应该很好理解,这样就调用了父类的构造函数
    public InheritTest(string name):base(name)
    {

    }
}

但如果想在调用父类的构造函数之前,更改这个值该怎么办

//Microsoft给出的方法是:在子类中重写虚方法,并按如下方式调用

public InheritTest : BaseClass
{    
    
    public InheritTest(string name):base(ModifyBase(name))
    {

    }
    private static string ModifyBase(string newName)
    {
        return newName.Toupper();
    }
}

虚拟方法是在基类中创建的方法,并且可以在子类中重写,这也是面向对象编程中多态性概念的由来。

如何在一个字符串中统计另一个字符串的字数

这里演示了两种方法,一种使用正则表达式Regex,另一种使用了Foreach循环

foreach(Match m in Regex.Matches(test,"you"))
{
    wordCount++;
}

foreach(char value in test)
{
    if(value == 'y')
    {
        charCount ++ ;
    }
}

使用foreach统计字符的话还是比较简单的,统计字符串的话还是使用*Regex*更加简单,并且高效。


如何检测一个数是否是2的幂

static bool CheckPowerOfTwo(ulong number)
{
    return (number != 0) && ((number & (number - 1 )) == 0);
}

number - 1number&运算,如果number是2的幂,那么这个值总是为0,这就是关键点

breakcontinue的区别,中继循环和继续执行循环的区别

static void breakVSContinue()
{
    for(int i = 0;i < 10 ;i++)
    {
        if(i ==0) break;
        DoSomeThingWith(i);
    }
}

abstractvirtual函数的区别

  • 抽象函数没有任何实现,并且必须被重写

  • 虚函数可能有一个实现,这不是必须的。并且接下来能够被重写

  • 对于抽象函数你不能调用base.method(),但对于虚函数你可以这么做

refhe out区别

一个简单的回答说两者在visual stuido 中工作基本没有区别。,区别就是:你需要初始化ref,而无须初始化out