C#的25个基础概念(抄)

1.静态变量和非静态变量的区别?
答:
静态变量
静态变量使用static修饰符进行声明,在所属累被装载时创建,通过类进行访问。所属类的所有实例的同一静态变量都是同一个值。
非静态变量
不带有static修饰符声明的变量称作非静态变量,在类被实例化时创建。
通过对象进行访问。同一个类的不同实例的同一非静态变量可以是不同的值。

ContractedBlock.gif ExpandedBlockStart.gif Code
None.gifusing System;
None.gif
using System.Collections.Generic;
None.gif
using System.Text;
None.gif
namespace Example01
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif  
class program
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif   
class Class1
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif   
public static String staticStr ="class";
InBlock.gif   
public String notstaticStr ="obj";
ExpandedSubBlockEnd.gif}

InBlock.gif
InBlock.gif  
static void Main(string[] args)
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif   
dot.gif{
InBlock.gif    
//静态变量通过类进行访问,该类所有的实例的同一静态变量都时同一个值。
ExpandedSubBlockStart.gifContractedSubBlock.gif
 Console.WriteLine(dot.gif{0},Class1.staticStr);
InBlock.gif
InBlock.gif  Class1 tmpObj1 
= new Class1();
InBlock.gif  tmpObj1.notstaticStr 
= "tmpObj1";
InBlock.gif  Class 
2 tmpObj2 = new  Class();
InBlock.gif
//非静态变量通过对象进行访问,不同的对象的同一非静态变量可以有不同的值。
InBlock.gif

InBlock.gif
ExpandedSubBlockEnd.gif   }

InBlock.gif
ExpandedSubBlockEnd.gif}

InBlock.gif
ExpandedBlockEnd.gif}

结果:
Class1 ' s staticStr: Class
tmpObj1 ' s notstaticStr: tmpObj1
tmpObj2 ' s notstaticStr: tmpObj2

2.const 和static readonly 区别?
答:
const
用const修饰符声明的变量叫常量,是在编译期初始化嵌入到客户端程序static readonly
用static readonly 修饰符声明的成员依然是变量,只不过具有和常量类似的使用方法,通过类进行访问,初始化后不可以修改。但与常量不同的时这种变量时在运行期初始化

测试类:
using System;
using System.Collections.Generic;
using System.Text;
namespace Example02Lib
{
    
public class Class1
    {
        
public const String strConst = "Const";
        
public static readonly String strStaticReadonly = "StaticReadonly";
        
//public const String strConst = "Const Changed";
        
//public static readonly String strStaticReadonly = "StaticReadonly Changed";
    }//5-1-a-s-p-x
}


客户端代码:
using System;
using System.Collections.Generic;
using System.Text;
using Example02Lib;
namespace Example02
{
    
class Program
    {
        
static void Main(string[] args)
        {
            
//修改Example02中Class1的strConst初始值后,只编译Example02Lib项目
            
//然后到资源管理器里把新编译的Example02Lib.dll拷贝Example02.exe所在的目录,执行Example02.exe
            
//切不可在IDE里直接调试运行因为这会重新编译整个解决方案!!
            
//可以看到strConst的输出没有改变,而strStaticReadonly的输出已经改变
            
//表明Const变量是在编译期初始化并嵌入到客户端程序,而StaticReadonly是在运行时初始化的
            Console.WriteLine("strConst : {0}", Class1.strConst);
            Console.WriteLine(
"strStaticReadonly : {0}", Class1.strStaticReadonly);
            Console.ReadLine();
        }
    }
}

3.extern 是什么意思?
答:
 extern 修饰符用于声明由程序及外部实现的成员函数,经常用与系统API函数的调用(通过 DLLImport).注意,和DllImport一起使用时要加上static修饰符,也可以用于对于同一程序集不同版本的组件的调用(用extern声明别名)不能与abstract修饰符同时使用;

ContractedBlock.gif ExpandedBlockStart.gif Code
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
namespace Example03
{
    
class Program
    {
        
//注意DllImport是一个Attribute Property,在System.Runtime.InteropServices命名空间中定义
        
//extern与DllImport一起使用时必须再加上一个static修饰符
        [DllImport("User32.dll")]
        
public static extern int MessageBox(int Handle, string Message, string Caption, int Type);
        
static int Main()
        {
            
string myString;
            Console.Write(
"Enter your message: ");
            myString 
= Console.ReadLine();
            
return MessageBox(0, myString, "My Message Box", 0);
        }
    }
}

4.abstract时什么意思?
答:
abstract修饰符可以用于类,方法,属性,事件和索引指示器(indexer),表示其为抽象成员abstract 不可以和static、virtual,override一起使用。
声明为abstract 成员可以不包括实现代码,但只有类中还有未实现的抽象成员,该类就不可以被实例化,通常用于强制继承必须实现某一成员。
示例:

ContractedBlock.gif ExpandedBlockStart.gif Code
using System;
using System.Collections.Generic;
using System.Text;
namespace Example04
{
    
#region 基类,抽象类
    
public abstract class BaseClass
    {
        
//抽象属性,同时具有get和set访问器表示继承类必须将该属性实现为可读写
        public abstract String Attribute
        {
            
get;
            
set;
        }
        
//抽象方法,传入一个字符串参数无返回值
        public abstract void Function(String value);
        
//抽象事件,类型为系统预定义的代理(delegate):EventHandler
        public abstract event EventHandler Event;
        
//抽象索引指示器,只具有get访问器表示继承类必须将该索引指示器实现为只读
        public abstract Char this[int Index]
        {
            
get;
        }
    }
    
#endregion
    
#region 继承类
    
public class DeriveClass : BaseClass
    {
        
private String attribute;
        
public override String Attribute
        {
            
get
            {
                
return attribute;
            }
            
set
            {
                attribute 
= value;
            }
        }
        
public override void Function(String value)
        {
            attribute 
= value;
            
if (Event != null)
            {
                Event(
thisnew EventArgs());
            }
        }
        
public override event EventHandler Event;
        
public override Char this[int Index]
        {
            
get
            {
                
return attribute[Index];
            }
        }
    }
    
#endregion
    
class Program
    {
        
static void OnFunction(object sender, EventArgs e)
        {
            
for (int i = 0; i < ((DeriveClass)sender).Attribute.Length; i++)
            {
                Console.WriteLine(((DeriveClass)sender)[i]);
            }
        }
        
static void Main(string[] args)
        {
            DeriveClass tmpObj 
= new DeriveClass();
            tmpObj.Attribute 
= &amp;quot;1234567&amp;quot;;
            Console.WriteLine(tmpObj.Attribute);
            
//将静态函数OnFunction与tmpObj对象的Event事件进行关联
            tmpObj.Event += new EventHandler(OnFunction);
            tmpObj.Function(
&amp;quot;7654321&amp;quot;);
            Console.ReadLine();
        }
    }
}


结果:
1234567
7
6
5
4
3
2
1 


转载于:https://www.cnblogs.com/mygood/articles/1407028.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值