你的位置:首页 > 软件开发 > ASP.net > C#基础知识面试经典[整理]

C#基础知识面试经典[整理]

发布时间:2016-03-16 17:00:10
个人网站:http://www.51pansou.com.net视频下载:.net视频教程.net源码下载:.net源码 当初学 C# 时是找个人大概问了一下数据类型和分支语句就开始做项目了。这两天又全面的看了一下相关的基础知识(学而时习之嘛),总结了25个问题:1 ...

C#基础知识面试经典[整理]

个人网站:http://www.51pansou.com

.net视频下载:.net视频教程

.net源码下载:.net源码

    当初学 C# 时是找个人大概问了一下数据类型和分支语句就开始做项目了。这两天又全面的看了一下相关的基础知识(学而时习之嘛),总结了25个问题:

1.静态成员和非静态成员的区别? 

20.如何手工释放资源?

答:

 .NET 平台在内存管理方面提供了GC(GarbageCollection),负责自动释放托管资源和内存回收的工作。但在以下两种情况需要我们手工进行资源释放:一、由于它无法对非托管资源进行释放,所以我们必须自己提供方法来释放对象内分配的非托管资源,比如你在对象的实现代码中使用了一个COM对象;二、你的类在运行是会产生大量实例(象 GIS中的Geometry),必须自己手工释放这些资源以提高程序的运行效率

最理想的办法是通过实现一个接口显式的提供给客户调用端手工释放对象,System 命名空间内有一个 IDisposable 接口,拿来做这事非常合适,省得我们自己再声明一个接口了

示例:

using System;
using System.Collections.Generic;
using System.Text;
 
namespace Example20
{
  class Program
  {
    class Class1 : IDisposable
    {
      //析构函数,编译后变成 protected void Finalize(),GC会在回收对象前会调用调用该方法
      ~Class1()
      {
        Dispose(false);
      }
 
      //通过实现该接口,客户可以显式地释放对象,而不需要等待GC来释放资源,据说那样会降低效率
      void IDisposable.Dispose()
      {
        Dispose(true);
      }
 
      //将释放非托管资源设计成一个虚函数,提供在继承类中释放基类的资源的能力
      protected virtual void ReleaseUnmanageResources()
      {
        //Do something...
      }
 
      //私有函数用以释放非托管资源
      private void Dispose(bool disposing)
      {
        ReleaseUnmanageResources();
 
        //为true时表示是客户显式调用了释放函数,需通知GC不要再调用对象的Finalize方法
        //为false时肯定是GC调用了对象的Finalize方法,所以没有必要再告诉GC你不要调用我的Finalize方法啦
        if (disposing)
        {
          GC.SuppressFinalize(this);
        }
      } 
    }
    static void Main(get='_blank'>string[] args)
    {
      //tmpObj1没有手工释放资源,就等着GC来慢慢的释放它吧
      Class1 tmpObj1 = new Class1();
 
      //tmpObj2调用了Dispose方法,传说比等着GC来释放它效率要调一些
      //个人认为是因为要逐个对象的查看其元数据,以确认是否实现了Dispose方法吧
      //当然最重要的是我们可以自己确定释放的时间以节省内存,优化程序运行效率
      Class1 tmpObj2 = new Class1();
      ((IDisposable)tmpObj2).Dispose();
    }
  }
}

23.explicit 和 implicit 的含义?

答:

explicit 和 implicit 属于转换运算符,如用这两者可以让我们自定义的类型支持相互交换

explicti 表示显式转换,如从 A -> B 必须进行强制类型转换(B = (B)A)

implicit 表示隐式转换,如从 B -> A 只需直接赋值(A = B)

隐式转换可以让我们的代码看上去更漂亮、更简洁易懂,所以最好多使用 implicit 运算符。不过!如果对象本身在转换时会损失一些信息(如精度),那么我们只能使用 explicit 运算符,以便在编译期就能警告客户调用端

示例: 

using System;
using System.Collections.Generic;
using System.Text;
 
namespace Example23
{
  class Program
  {
    //本例灵感来源于大话西游经典台词“神仙?妖怪?”--主要是我实在想不出什么好例子了
    class Immortal
    {
      public string name;
      public Immortal(string Name)
      {
        name = Name;
      }
      public static implicit operator Monster(Immortal value)
      {
        return new Monster(value.name + ":神仙变妖怪?偷偷下凡即可。。。");
      }
    }
    class Monster
    {
      public string name;
      public Monster(string Name)
      {
        name = Name;
      }
      public static explicit operator Immortal(Monster value)
      {
        return new Immortal(value.name + ":妖怪想当神仙?再去修炼五百年!");
      }
    }
    static void Main(string[] args)
    {
      Immortal tmpImmortal = new Immortal("紫霞仙子");
      //隐式转换
      Monster tmpObj1 = tmpImmortal;
      Console.WriteLine(tmpObj1.name);
 
      Monster tmpMonster = new Monster("孙悟空");
      //显式转换
      Immortal tmpObj2 = (Immortal)tmpMonster;
      Console.WriteLine(tmpObj2.name);
 
      Console.ReadLine();
    }
  }
}

 

海外公司注册、海外银行开户、跨境平台代入驻、VAT、EPR等知识和在线办理:https://www.xlkjsw.com

原标题:C#基础知识面试经典[整理]

关键词:C#

C#
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

可能感兴趣文章

我的浏览记录