2017-12-15 14:02:40 panna_linda 阅读数 121
  • C#急速入门

    Unity开发,C#绝对是基础中的基础,课程针对纯小白而设计,各种语言细节在课程里均有涉猎,从原理到实战,从底层到算法,你想了解的C#,这里应有尽有,除了讲解,还有练习,你说棒不棒,哈哈,当然如果你是有其他语言基础的同学,课程依然会让你收货满满。来吧,我们进入正题。

    13401 人正在学习 去看看 张建飞
1 类

语法:

public class 类名
{

 类中可以存放的对象有: 

   字段:存储数据
   属性:保护字段,对字段的取值和设值进行限定
   方法:描述对象的行为
   构造函数:初始化对象(给对象的每个属性依次的赋值)

}

写好了一个类之后,我们需要创建这个类的对象,管创建这个类的对象过程称之为类的实例化。使用关键字 new

当我们创建好一个类的对象后,需要给这个对象的每个属性去赋值。我们管这个过程称之为对象的初始化。

类是不占内存的,而对象是占内存的。

2 属性

属性的作用就是保护字段、对字段的赋值和取值进行限定。
属性的本质就是两个方法,一个叫get()一个叫set()。

get:在输出时进行判断,对字段进行操作

set:在赋值时进行判断,对value进行操作

既有get()也有set()我们称之为可读可写属性。
只有get()没有set()我们称之为只读属性
没有get()只有set()我们称之为只写属性


3 this关键字

this:表示当前这个类的对象。


例子:新建一个Person类,在里面属性里面对Gender和Age进行限定,初始化类对象时会给定一些不在限定范围内的值

新建Person类:

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

namespace _01面向对象
{
    public class Person
    {
        private string _name; //字段 private属性
        public string Name   //属性 pbulic 类型
        {
            //当你输出属性的值得时候 会执行get方法
            get { return _name; }
            //当你给属性赋值的时候 首先会执行set方法
            set { _name = value; }
        }
        private int _age;
        public int Age
        {
            get { return _age; }
            //set对value进行操作(在赋值时进行判断)
            set
            {

                if (value < 0 || value > 100)
                {
                    value = 0;
                }

                _age = value;
            }
        }
        private char _gender;
        public char Gender
        {
            //get对字段进行操作(在输出时进行判断)
            get
            {
                if (_gender != '男' && _gender != '女')
                {
                    return _gender = '男';
                }
                return _gender;

            }
            set { _gender = value; }
        }
        public void CHLSS()
        {
            Console.WriteLine("我叫{0},我今年{1}岁了,我是{2}生,我可以吃喝拉撒睡哟~~~", this.Name, this.Age, this.Gender);//打印属性
        }
    }
}
Program类:

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

namespace _01面向对象
{
    class Program
    {
        static void Main(string[] args)
        {
           // 创建Person类的对象(类的实例化)
            Person suQuan = new Person();
            //给对象初始化
            suQuan.Name = "孙全";    //Age和Gender不在属性限定范围内
            suQuan.Age = -23;
            suQuan.Gender = '春';
            suQuan.CHLSS();

            Person xiaolan = new Person();
            xiaolan.Name = "小兰";         ////Age和Gender在属性限定范围内
            xiaolan.Age=18;
            xiaolan.Gender = '女';
            xiaolan.CHLSS();
            Console.ReadKey();
            
        }
    }
}

输出结果:

我叫孙全,我今年0岁了,我是男生,我可以吃喝拉撒睡哟~~~
我叫小兰,我今年18岁了,我是女生,我可以吃喝拉撒睡哟~~~







2017-09-23 22:01:17 s_p_y_s 阅读数 273
  • C#急速入门

    Unity开发,C#绝对是基础中的基础,课程针对纯小白而设计,各种语言细节在课程里均有涉猎,从原理到实战,从底层到算法,你想了解的C#,这里应有尽有,除了讲解,还有练习,你说棒不棒,哈哈,当然如果你是有其他语言基础的同学,课程依然会让你收货满满。来吧,我们进入正题。

    13401 人正在学习 去看看 张建飞

数据类型     属性名

{     

       get{

                  return  表达式1;         }

       set{

                表达式2;}

}

  class Class1
    {
        private int x;
        public int attc
        {
            get { return x; }
            set { x = value; }
        }
    }
class Program
{
static void Main(string[] args)
{
Class1 a = new Class1();
a.attc= 100000000;
Console.WriteLine(a.attc);
Console.ReadLine();
}
}


使用属性获取其他类中的私有成员时,只需要保证属性中有get和set这两个访问器即可,a.attc.get();或者a.attc.set();都是错误的。

2017-03-12 18:55:57 wzcyamadie 阅读数 919
  • C#急速入门

    Unity开发,C#绝对是基础中的基础,课程针对纯小白而设计,各种语言细节在课程里均有涉猎,从原理到实战,从底层到算法,你想了解的C#,这里应有尽有,除了讲解,还有练习,你说棒不棒,哈哈,当然如果你是有其他语言基础的同学,课程依然会让你收货满满。来吧,我们进入正题。

    13401 人正在学习 去看看 张建飞

    闲话少说,直入主题。

    类:是个抽象的概念,是个模子,确定对象会拥有的特征(属性)和行为(方法)。是具有相同特征的一组对象的抽象,类不占内存。


    对象:看的见,摸得着,特指的,具体的,对象是类的一个实例,对象占内存。

    属性:理解为一种特征

    属性值:描述这个特征的值。

    方法:对象的行为。


举例:
   区分类和对象:

    int number    人类 张三


    number是int类型的一个实例
    张三是“人类”类型的一个实例

    int是类。number是int类型的一个对象。
   “人类”是累,张三是“人类”类型的一个对象
 
  区分对象和属性:
    张三,李四是两个对象。

    张三:年龄:20岁

          性别:男
          学历:大学

    李四:  年龄:21岁
           性别:女
           学历:博士

    其中,年龄,性别,学历,都是属性,
    具体的20岁,21岁,男,女,大学,博士,是属性值。

 注意:对象一定是具体的!
    比如:老王的老婆是不是个对象?---不是,老王不是具体的,也许有很多个老王,那就有很多个老王的老婆。。。不具体,不是对象
    我们班主任老王他老婆是不是对象?---是,我们班主任是确定的,他老婆就是确定的具体的,是对象。
(不要转牛角尖,,说老王不止一个老婆。。。何必呢,让老王跟老婆吵架。。。)
2016-04-25 22:37:33 U_9_5 阅读数 14145
  • C#急速入门

    Unity开发,C#绝对是基础中的基础,课程针对纯小白而设计,各种语言细节在课程里均有涉猎,从原理到实战,从底层到算法,你想了解的C#,这里应有尽有,除了讲解,还有练习,你说棒不棒,哈哈,当然如果你是有其他语言基础的同学,课程依然会让你收货满满。来吧,我们进入正题。

    13401 人正在学习 去看看 张建飞

by 刘壮 | 2016/04/25 23:14

你好,我曾经接过一个上海的上机面试题,涉及到xml。今天分享一下c#是如何操作xml的。

大纲:
1.创建XML并实现保存
2.向XML中添加属性
3.向XML中追加内容
4.读取XML文件
5.读取带属性的XML文件,含有移除(有一句提到)

1.创建XML并实现保存
首先,我们要实现添加不含属性的xml文档。这里给出一个类,和一个调用方法以及贴出效果图(案例中我用的中文xml,希望不给你带来观看效果)

public static void CreateXML(string xmlName)
        {
            //通过代码创建XML文档
            //1、引用命名空间   System.Xml
            //2、创建一个 xml 文档
            XmlDocument xml = new XmlDocument();
            //3、创建一行声明信息,并添加到 xml 文档顶部
            XmlDeclaration decl = xml.CreateXmlDeclaration("1.0", "utf-8", null);
            xml.AppendChild(decl);

            //4、创建根节点
            XmlElement rootEle = xml.CreateElement("人");
            xml.AppendChild(rootEle);
            //5、创建子结点|属性:性别
            XmlElement childEle = xml.CreateElement("性别");
            rootEle.AppendChild(childEle);

            XmlElement c2Ele = xml.CreateElement("男");
            c2Ele.InnerText = "1";
            childEle.AppendChild(c2Ele);
            c2Ele = xml.CreateElement("女");
            c2Ele.InnerText = "0";
            childEle.AppendChild(c2Ele);


            //6、创建子节点|属性:四肢
            childEle = xml.CreateElement("胳膊");
            rootEle.AppendChild(childEle);

            c2Ele = xml.CreateElement("右胳膊");
            c2Ele.InnerText = "一般";
            childEle.AppendChild(c2Ele);

            c2Ele = xml.CreateElement("左胳膊");
            c2Ele.InnerText = "一般";
            childEle.AppendChild(c2Ele);

            c2Ele = xml.CreateElement("左退");
            c2Ele.InnerText = "粗壮";
            childEle.AppendChild(c2Ele);

            c2Ele = xml.CreateElement("右腿");
            c2Ele.InnerText = "粗壮";
            childEle.AppendChild(c2Ele);

            xml.Save(xmlName);

        }

调用方法:

 CreateXML("People.xml");

效果图:
这里写图片描述

2.向XML中添加属性

在上面的类中, 最后的xml.Save(xmlName);前添加下面的代码

            //添加带有属性的节点
            childEle = xml.CreateElement("hair");
            childEle.SetAttribute("Color", "black");
            childEle.InnerText = "头发";
            rootEle.AppendChild(childEle);

运行,查看你的xml文档,就会多出来一行:

  <hair Color="black" />

效果如图:
这里写图片描述

3.向XML中追加内容
创建一个控制台程序:
Main函数如下:

     static void Main(string[] args)
        {
            //创XML建对象
            XmlDocument doc = new XmlDocument();
            //声明根节点
            XmlElement books;
            //判断文件是否存在
            if (File.Exists("Books.xml"))
            {
                //该文件存在
                //加载文件
                doc.Load("Books.xml");
                //获得根节点
                books = doc.DocumentElement;

            }
            else//该文件不存在
            {
                //创建声明
                XmlDeclaration dec = doc.CreateXmlDeclaration("1.0", "utf-8", null);
                doc.AppendChild(dec);
                //创建根节点
                books = doc.CreateElement("Books");
                doc.AppendChild(books);
            }

            //开始正常写入信息就可以了
            XmlElement book1 = doc.CreateElement("Book");
            books.AppendChild(book1);

            XmlElement name = doc.CreateElement("Name");
            name.InnerText = "大话西游"+(new Random()).Next(0,1000);
            book1.AppendChild(name);

            doc.Save("Books.xml");
            Console.WriteLine("追加完成");
            Console.ReadKey();
        }

运行两次,效果图:
这里写图片描述
4.读取XML文件
这里没有详细写,重点在第5条。你可以找到答案

            //获得子节点   返回数组
            XmlNodeList xnl =  books.ChildNodes;
            foreach (XmlNode  item in xnl)
            {
                Console.WriteLine(item.InnerXml+":"+ item.InnerText);
            }

5.读取带属性的XML文件
创建一个控制台程序,你不需要关心xml的创建等等,我写好了,都在这里Program.cs代码:

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

namespace _027创建XML文档
{
    class Program
    {
        static void Main(string[] args)
        {

            CreateXML("People.xml");
            ReadXML("People.xml");
            Console.WriteLine("创建成功");
            Console.ReadKey();
        }
        public static void ReadXML(string filename)
        {
            //创建对象
            XmlDocument xml = new XmlDocument();
            //加载 xml 文件
            xml.Load(filename);
            //获取根节点
            XmlElement rootEle = xml.DocumentElement;

            //获取子节点集合

            XmlNodeList xnl = xml.SelectNodes("/人/胳膊/左胳膊");
            foreach (XmlNode item in xnl)
            {
                Console.WriteLine(item.Attributes["毛"].InnerText);// .Value);
                //Console.WriteLine(item.Attributes["Hair"].Value);
            }
            //5、移除
            //xnl.RemoveAll();
        }
        public static void CreateXML(string xmlName)
        {
            //通过代码创建XML文档
            //1、引用命名空间   System.Xml
            //2、创建一个 xml 文档
            XmlDocument xml = new XmlDocument();
            //3、创建一行声明信息,并添加到 xml 文档顶部
            XmlDeclaration decl = xml.CreateXmlDeclaration("1.0", "utf-8", null);
            xml.AppendChild(decl);

            //4、创建根节点
            XmlElement rootEle = xml.CreateElement("人");
            xml.AppendChild(rootEle);
            //5、创建子结点|属性:性别
            XmlElement childEle = xml.CreateElement("性别");
            rootEle.AppendChild(childEle);

            XmlElement c2Ele = xml.CreateElement("男");
            c2Ele.InnerText = "1";
            childEle.AppendChild(c2Ele);
            c2Ele = xml.CreateElement("女");
            c2Ele.InnerText = "0";
            childEle.AppendChild(c2Ele);


            //6、创建子节点|属性:四肢
            childEle = xml.CreateElement("胳膊");
            rootEle.AppendChild(childEle);

            c2Ele = xml.CreateElement("右胳膊");
            c2Ele.InnerText = "一般";
            childEle.AppendChild(c2Ele);

            c2Ele = xml.CreateElement("左胳膊");
            c2Ele.SetAttribute("毛", "真密");
            c2Ele.InnerText = "一般";
            childEle.AppendChild(c2Ele);

            c2Ele = xml.CreateElement("左退");
            c2Ele.InnerText = "粗壮";
            childEle.AppendChild(c2Ele);

            c2Ele = xml.CreateElement("右腿");
            c2Ele.InnerText = "粗壮";
            childEle.AppendChild(c2Ele);

            //添加带有属性的节点
            childEle = xml.CreateElement("hair");
            childEle.SetAttribute("Color", "black");
            childEle.InnerText = "头发";
            rootEle.AppendChild(childEle);

            xml.Save(xmlName);

        }
    }
}

运行,你会得到:“真密”

结束!!!
Web前后端技术交流群:
点击链接加入群【Web前后端技术①群】:http://jq.qq.com/?_wv=1027&k=29uDHtR

C# 类
2018-01-19 10:24:11 qq_17813937 阅读数 85
  • C#急速入门

    Unity开发,C#绝对是基础中的基础,课程针对纯小白而设计,各种语言细节在课程里均有涉猎,从原理到实战,从底层到算法,你想了解的C#,这里应有尽有,除了讲解,还有练习,你说棒不棒,哈哈,当然如果你是有其他语言基础的同学,课程依然会让你收货满满。来吧,我们进入正题。

    13401 人正在学习 去看看 张建飞

如有错误你爬网线来打我啊

世界是由对象组成的

对象

一台汽车,一个螺母,一速光线等等。每一样定义都有各自的属性。它们都是一个个对象

在 C# 使用关键字 class 定义对象。

例如现在我需要给我的世界(编程的世界)定义三维坐标使得物体可以有地方放置

class Vector3
{

}

构造函数

构造函数 ,是一种特殊的方法。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们 即构造函数的重载

它没有返回值,没有返回值,没有返回值。重要的事说三次

访问修饰符 class Vector3
{
    访问修饰符 Vector3(参数列表)
    {

    }
}

析构函数

当对象结束其生命周期时(例如对象所在的函数已调用完毕),系统自动执行析构函数。析构函数往往用来做“清理善后” 的工作(例如在建立对象时用new开辟了一片内存空间,delete会自动调用析构函数后释放内存)。

访问修饰符 class Vector3
{
    ~Vector3(参数列表)
    {

    }
}

字段

很好,现在我已经定义了一个 三维向量,现在我需要向这个对象说明它应该有XYZ坐标轴的数据
class Vector3
{
    float x,y,z;
}

现在这个三维向量已经包含了三维数据。当然它现在仅仅能够自己使用这些属性而已。

你可能会说直接使用 public 给它们添加 公开权限 就好。

class Vector3
{
   public float x,y,z;
}

的确 三维向量 的数据并不需要多余操作只需要直接添加权限给它。

但是有些场合可能并不能直接获得/设置相应的数据

它可能需要经过运算才能被批准获得/设置值

如果你看了上一章的函数,可能萌生了使用函数来获得/设置对象的属性

class Vector3
{
    float x,y,z;
    public float GetX(){
        return x;
    }
    public void SetX(float value){
        x = value;
    }
    public float GetY(){
        return y;
    }
    public void SetY(float value){
        y = value;
    }
    public float GetZ(){
        return z;
    }
    public void SetZ(float value){
        z = value;
    }
}
可以看到当你这样去写的时候将会非常繁琐。

属性访问器

在C#我们并不需要这样去做,我们应该做的应该是直接使用访问器对它进行访问

public class Vector3
{
    float x,y,z;

    public float X{
        get{return x;}
        set{x=value;}
    }
    
    public float Y{
        get{return y;}
        set{y=value;}   
    }
    
    public float Z{
        get{return z;}
        set{z=value;}
    }
}
public class _Main
{
    static void Main(string [] args)
    {
        Vector3 pos = new Vector3();
        //! 1
        pos.X = 123;
        //! 2
        Console.WriteLine(pos.X);
    }
}
1、设置属性。set 设置访问器,它有一个内定的变量 value 这个变量可以获得赋值,即当前 value 为 123

访问修饰符 类型 名称
{
    访问休息符 set{
        代码块
        变量 = value;
    }
}
2、访问属性。get 读取访问器,它一定要有 return 返回值,在返回前你可以进行任意的运算

访问修饰符 类型 名称
{
    访问休息符 get{
        代码块
        return 返回值;
    }
}
使用了访问器后代码就变得精简了。不像使用函数一样繁琐。

封装

对象有些方法是不应该被外部访问的。

例如我现在有一台车,我可以启动它,但是我不需要知道它在启动的过程中到底进行了那些操作。

这种情况可以使用 访问修饰符 对对象进行封装,使得外部不能够知道具体的实现细节

  • public:所有对象都可以访问;
  • private:对象本身在对象内部可以访问,如果不添加访问修饰符,那么这是默认的;
  • protected:只有该类对象及其子类对象可以访问
  • internal:同一个程序集的对象可以访问;
  • protected internal:访问限于当前程序集或派生自包含类的类型。

如果不能理解可以实际操作一下

继承

现在我需要写两个类, 一个是人,一个是学生

可能你会直接这样写

class Person
{
    string name;
    string address;
    long phone;
}
class Student
{
    string name;
    string address;
    long phone;
}
但是,我在这里要说的是,你首先是一个人,然后才是一个学生

那么 Student 应该是包含了 Preson 的所有属性的,所以我们的 Student 可以直接继承 Preson 这个类

class Person
{
    string name;
    string address;
    long phone;
}
class Student:Person
{
}

此时,Student 将会拥有 Preson 的所有属性、方法、字段

标准语法

class 名称:基类
{
}
注意,只能继承一个类。如果继承了类之后,当前类被称为 【子类/派生类】,被继承的类称为 【基类】

密封

有些类我们不希望它们被继承,那么可以使用关键字  sealed  对类或方法进行密封

class sealed Manager
{
   
}
对于密封类来说,表示不能继承该类
密封类不能作为基类被继承,但它可以继承别的类或接口
在密封类中不能声明受保护成员或虚成员,因为受保护成员只能从派生类进行访问,而虚成员只能在派生类中重写
由于密封类的不可继承性,因此密封类不能声明为抽象的,即sealed修饰符不能与abstract修饰符同时使用


既然可以设置为密封类,那么当然也可以设置为密封方法

但是,并不是所有方法都可以设置为密封方法,只有对基类的虚方法进行实现并提供具体的实现的方法才可以密封

密封后,如果继承该类,就不能重写该密封的方法。在密封方法中,sealed总是和override同时出现

class 名称:基类
{
    访问修饰符 sealed override 返回值 名称(参数列表)
    {
        代码块
    }
}

抽象

一个类不与具体的事物相联系,而只是表达一种抽象的概念。
如果我只知道它会有一个显示的函数,但是完全不知道应该如何去实现的时候,可以只声明接口不写实现

除了 添加了 abstract 外的都和正常的类一样

class abstract 名称
{
    访问修饰符 abstract 返回值 名称(参数列表);
}
不能创建抽象实例

如果想要使用,必须继承实现全部抽象方法和属性后才能创建实例。实现的方法必须和抽象类声明的方法一致

访问修饰符 class abstract 名称
{
    访问修饰符 abstract 返回值 名称(参数列表);
}
访问修饰符 class 名称:基类
{
    访问修饰符 override 返回值 名称(参数列表)
    {

    }
}

虚函数

我希望有一个成员函数(类内的函数)每一次继承后它的实现都不一样。

当继承后它调用的是当前类新写的方法,而不是基类的方法。

可以使用关键字 virtual 对该方法进行修饰,重写时使用 override 对方法进行修饰。虚函数可以不重写

访问修饰符 class  名称
{
    访问修饰符 virtual 返回值 名称(参数列表)
    {

    }
}
访问修饰符 class 名称:基类
{
    访问修饰符 override 返回值 名称(参数列表)
    {

    }
}
虚方法前不允许有static,abstract,或override修饰符
虚方法不能是私有的,因此不能使用private修饰符

接口

每一种品牌的水龙头它的接口尺寸都应该一样,毕竟我们不可能因为要换一个品牌的水龙头就换掉水厂

为了所有水龙头的接口都可以和水厂的接口链接。使用 Interface 定义接口的规范

访问修饰符 Interface 名称
{
    返回值 名称{get;}
    返回值 名称{set;}
    返回值 名称{get;get;}
    返回值 名称(参数列表);
}
类是可以同时继承多个接口的。继承后所有接口和属性等都必须实现

统一后无论是买什么牌子的水龙头都可以严实合缝的链接上水厂的接口

重载运算符

如果现在有两个 Vector3 实例 ,我想对它进行相加

public class Vector3
{
    float x,y,z;

    public float X{
        get{return x;}
        set{x=value;}
    }
    
    public float Y{
        get{return y;}
        set{y=value;}   
    }
    
    public float Z{
        get{return z;}
        set{z=value;}
    }
    public Vector3(){}
    public Vector3(float x, float y,float z)
    {
        this.x = x;
        this.y = y;
        this.z = z;
    }
}
public class _Main
{
    static void Main(string [] args)
    {
        Vector3 pos = new Vector3(1,1,1);
        Vector3 pos2 = new Vector3(2,2,2);
        Vector3 pos3 = new Vector3();
        pos3.X = pos.X + pos2.X;
        pos3.Y = pos.Y + pos2.Y;
        pos3.Z = pos.Z + pos2.Z;
    }
}

这样子看起来好蠢!我或许可以将它改为调用函数?

public class Vector3
{
    .....
    public static Vector3 Add(Vector3 pos,Vector3 pos2)
    {
        Vector3 pos3 = new Vector3();
        pos3.X = pos.X + pos2.X;
        pos3.Y = pos.Y + pos2.Y;
        pos3.Z = pos.Z + pos2.Z;
        return pos3;
    }
}
public class _Main
{
    static void Main(string [] args)
    {
        Vector3 pos = new Vector3(1,1,1);
        Vector3 pos2 = new Vector3(2,2,2);
        Vector3 pos3 = new Vector3();
        pos3 = pos3.Add(pos,pos2);
    }
}
看起来好多了,但是我还可以更加简便,那就是重载 + 运算符

public class Vector3
{
    .....
    public static Vector3 operator+(Vector3 pos,Vector3 pos2)
    {
        Vector3 pos3 = new Vector3();
        pos3.X = pos.X + pos2.X;
        pos3.Y = pos.Y + pos2.Y;
        pos3.Z = pos.Z + pos2.Z;
        return pos3;
    }
}
public class _Main
{
    static void Main(string [] args)
    {
        Vector3 pos = new Vector3(1,1,1);
        Vector3 pos2 = new Vector3(2,2,2);
        Vector3 pos3 = new Vector3();
        pos3 = pos + pos2;
    }
}
看起来是不是好多了,语法更加清晰了

重载运算符语法

    public static 返回值 operator+(类型 变量1,类型 变量2)
    {
        //代码块
        return 返回值;
    }
只有特定的运算符才能重载

部分类

部分类用partial 关键字修饰,允许把类、结构或接口放在多个文件中。一般情况下,一个类存储在单个文件中。但有时,多个开发人员需要访问同一个类,或者某种类型的代码生成器生成了一个类的某部分,所以把类放在多个文件中是有益的。

public partial class Vector3 : Vector2
{

}

public partial class Vector3
{

}
就算把类拆分类也只能继承一个类。如果有一个部分继承了类其他部分就不能继承了

部分方法

部分方法也可以是静态的,但它们总是私有的,且不能有返回值。它们使用的任何参数都不能是out参数,但可以是ref参数。部分方法还不能使用virtual、abstract、override、new、sealed和extern修饰符。

public partial class Vector3 : Vector2
{
    partial void DoSomething();
}

public partial class Vector3
{
    partial void DoSomething()
    {

    }
}




C#创建com组件

阅读数 3432

C# 创建XML文件

阅读数 67

C# 属性反射

阅读数 27

没有更多推荐了,返回首页