SIKI学习——C#中级教程_04构造函数

本文详细介绍了C#中的构造函数,包括其作用、声明语法、重载规则以及默认构造函数的情况。同时,文章讲解了属性的定义,包括属性的结构、访问方式、字段与属性的关联、只读/只写属性以及自动实现的属性。
摘要由CSDN通过智能技术生成

1、构造函数

1.构造函数
我们构造对象的时候,对象的初始化过程是自动完成的,但是在初始化对象的过程中有的时候需要做一些额外的工作,例如需要初始化对象存储的数据,构造函数就是用于初始化数据的函数。
声明基本的构造函数的语法就是声明一个和所在类同名的方法,但是该方法没有返回类型。
public class MyClass
{
public MyClass()
{
这个构造函数的函数体
}
}
当我们使用new关键字创建类的时候,就会调用构造方法。
我们一般会使用构造方法进行初始化数据的一些操作。
构造函数可以进行重载,跟普通函数重载是一样的规则
注意:
当我们不写,任何构造函数的时候,编译器会提供给我们一个默认的 无参的构造函数,但是如果我们定义了一个或者多个构造函数,编译器就不会再提供默认的构造函数。

namespace _001_调试和错误处理
{
    class Vector3
    {
        //我们定义了一个构造函数,那么编译器不会为我们提供构造函数了
        public Vector3()
        {
            Console.WriteLine("Vector3的构造函数被调用了");
        }
        //定义一个有参数的构造函数
        public Vector3(float x, float y, float z)
        {
            this.x = x;
            this.y = y;
            this.z = z;
            length = Length();
        }
        //编程规范上习惯把所有的字段设置成private,只可以在类内部访问,不可以通过对象访问
        private float x, y, z,length;
        //为字段提供set方法,来设置字段的值
        public void SetX(float x)
        {
            //如果我们直接在方法内部访问同名的变量,优先访问最近(形参)
            //我们可以通过this.x表示访问的是类的字段或者方法
            this.x = x;
        }
        public void SetY(float y)
        {
            this.y = y;
        }
        public void SetZ(float z)
        {
            this.z = z;
        }
        public float Length()
        {
            return(float)Math.Sqrt(x*x+y*y+z*z);
        }
    }
}
namespace _001_调试和错误处理
{
    class Program
    {
        static void Main(string[] args)
        {
            //Vector3 v1 = new Vector3();
            //v1.x = 1;
            //v1.y = 1;
            //v1.z = 1;//这是讲x,y,z直接在类中public的时候调用的
            //v1.SetX(1);
            //v1.SetY(1);
            //v1.SetZ(1);
            Vector3 v1 = new Vector3(1,1,1);
            Console.WriteLine(v1.Length());
            Console.ReadKey();
        }
    }
}

2.属性的定义

1.属性的定义
属性的定义结构:
public int MyIntProp
{
get
{
// get code
}
set
{
//set code
}
}
1,定义属性需要名字和类型
2,属性包含两个块 get块和set块
3,访问属性和访问字段一样,当取得属性的值的时候,就会调用属性中的get块,所以get块,类型需要一个返回值就是属性的类型;当我们去给属性设置值的时候,就会调用属性中的set块,我们可以在set块中通过value访问到我们设置的值。
例子:

namespace _001_调试和错误处理
{
    class Vector3
    {
        //我们定义了一个构造函数,那么编译器不会为我们提供构造函数了
        public Vector3()
        {
            Console.WriteLine("Vector3的构造函数被调用了");
        }
        //定义一个有参数的构造函数
        public Vector3(float x, float y, float z)
        {
            this.x = x;
            this.y = y;
            this.z = z;
            length = Length();
        }
        //编程规范上习惯把所有的字段设置成private,只可以在类内部访问,不可以通过对象访问
        private float x, y, z,length;
        //为字段提供set方法,来设置字段的值
        public void SetX(float x)
        {
            //如果我们直接在方法内部访问同名的变量,优先访问最近(形参)
            //我们可以通过this.x表示访问的是类的字段或者方法
            this.x = x;
        }
        public void SetY(float y)
        {
            this.y = y;
        }
        public void SetZ(float z)
        {
            this.z = z;
        }
        public float Length()
        {
            return(float)Math.Sqrt(x*x+y*y+z*z);
        }
        //定义属性
        public int MyIntProperty
        {
            set
            {
                Console.WriteLine("属性中set块被调用");//get和set可以只有其中一个
                Console.WriteLine("在set块中访问value的值是:"+value);
            }
            //如果没有get块,就不能通过属性取值了
            get
            {
                Console.WriteLine("属性中的get块被调用");
                return 100;
            }
        }
    }
}
namespace _001_调试和错误处理
{
    class Program
    {
        static void Main(string[] args)
        {
            //Vector3 v1 = new Vector3();
            //v1.x = 1;
            //v1.y = 1;
            //v1.z = 1;//这是讲x,y,z直接在类中public的时候调用的
            //v1.SetX(1);
            //v1.SetY(1);
            //v1.SetZ(1);
            Vector3 v1 = new Vector3(1,1,1);
            //Console.WriteLine(v1.Length());
            //使用属性
            v1.MyIntProperty = 600;//对属性设置值
            int temp = v1.MyIntProperty;//对属性取值
            Console.WriteLine(temp);//这里的值是100
            Console.ReadKey();
        }
    }
}

2.通过属性来访问字段
我们习惯上把字段设置为私有的,这样外界不能修改字段的值,然后我们可以通过定义属性来设置和取得字段中的值
private int age;
public int Age//习惯上属性大写,字段小写
{
set
{
if(value<0)return;
}
get
{
return age;
}
}

namespace _001_调试和错误处理
{
    class Vector3
    {
        //我们定义了一个构造函数,那么编译器不会为我们提供构造函数了
        public Vector3()
        {
            Console.WriteLine("Vector3的构造函数被调用了");
        }
        //定义一个有参数的构造函数
        public Vector3(float x, float y, float z)
        {
            this.x = x;
            this.y = y;
            this.z = z;
            length = Length();
        }
        //编程规范上习惯把所有的字段设置成private,只可以在类内部访问,不可以通过对象访问
        private float x, y, z,length;
        
        //通过属性设置字段的值
        public float X
        {
            get
            {
                return x;
            }
            set
            {
                x = value;
            }
        }
        //为字段提供set方法,来设置字段的值
        public void SetX(float x)
        {
            //如果我们直接在方法内部访问同名的变量,优先访问最近(形参)
            //我们可以通过this.x表示访问的是类的字段或者方法
            this.x = x;
        }
        public void SetY(float y)
        {
            this.y = y;
        }
        public void SetZ(float z)
        {
            this.z = z;
        }
        public float Length()
        {
            return(float)Math.Sqrt(x*x+y*y+z*z);
        }
        //定义属性
        public int MyIntProperty
        {
            set
            {
                Console.WriteLine("属性中set块被调用");//get和set可以只有其中一个
                Console.WriteLine("在set块中访问value的值是:"+value);
            }
            //如果没有get块,就不能通过属性取值了
            get
            {
                Console.WriteLine("属性中的get块被调用");
                return 100;
            }
        }
    }
}
namespace _001_调试和错误处理
{
    class Program
    {
        static void Main(string[] args)
        {
            //Vector3 v1 = new Vector3();
            //v1.x = 1;
            //v1.y = 1;
            //v1.z = 1;//这是讲x,y,z直接在类中public的时候调用的
            //v1.SetX(1);
            //v1.SetY(1);
            //v1.SetZ(1);
            Vector3 v1 = new Vector3(1,1,1);
            //Console.WriteLine(v1.Length());
            //使用属性
            //v1.MyIntProperty = 600;//对属性设置值
            //int temp = v1.MyIntProperty;//对属性取值
            //Console.WriteLine(temp);//这里的值是100
            //通过属性访问字段的值
            v1.X = 100;
            Console.WriteLine(v1.X);
            Console.ReadKey();
        }
    }
}

3.设置属性的只读或者只写
private string name;
public string name
{
get
{
return name;
}
}
属性可以只提供一个set块或者get块
4.属性的访问修饰符
private string name
{
get
{
return name;
}
private set
{
name=value;
}
}

namespace _001_调试和错误处理
{
    class Vector3
    {
        //我们定义了一个构造函数,那么编译器不会为我们提供构造函数了
        public Vector3()
        {
            Console.WriteLine("Vector3的构造函数被调用了");
        }
        //定义一个有参数的构造函数
        public Vector3(float x, float y, float z)
        {
            this.x = x;
            this.y = y;
            this.z = z;
            length = Length();
        }
        //编程规范上习惯把所有的字段设置成private,只可以在类内部访问,不可以通过对象访问
        private float x, y, z,length;
        private int age;
        public int Age
        {
            set
            {//通过set方法在设置值之前做一些校验的工作,属性的更多好处,需要在写代码过程中体会
                if (value >= 0)
                {
                    age = value;
                }
            }
        }
        //通过属性设置字段的值
        public float X
        {
            get
            {
                return x;
            }
            //属性的访问修饰符private set
           private set//如果在get或者set前面加上private,表示这个块只能在类内部调用
            {
                x = value;
            }
        }
        //为字段提供set方法,来设置字段的值
        public void SetX(float x)
        {
            //如果我们直接在方法内部访问同名的变量,优先访问最近(形参)
            //我们可以通过this.x表示访问的是类的字段或者方法
            this.x = x;
        }
        public void SetY(float y)
        {
            this.y = y;
        }
        public void SetZ(float z)
        {
            this.z = z;
        }
        public float Length()
        {
            return(float)Math.Sqrt(x*x+y*y+z*z);
        }
        //定义属性
        public int MyIntProperty
        {
            set
            {
                Console.WriteLine("属性中set块被调用");//get和set可以只有其中一个
                Console.WriteLine("在set块中访问value的值是:"+value);
            }
            //如果没有get块,就不能通过属性取值了
            get
            {
                Console.WriteLine("属性中的get块被调用");
                return 100;
            }
        }
    }
}
namespace _001_调试和错误处理
{
    class Program
    {
        static void Main(string[] args)
        {
            //Vector3 v1 = new Vector3();
            //v1.x = 1;
            //v1.y = 1;
            //v1.z = 1;//这是讲x,y,z直接在类中public的时候调用的
            //v1.SetX(1);
            //v1.SetY(1);
            //v1.SetZ(1);
            Vector3 v1 = new Vector3(1,1,1);
            //Console.WriteLine(v1.Length());
            //使用属性
            //v1.MyIntProperty = 600;//对属性设置值
            //int temp = v1.MyIntProperty;//对属性取值
            //Console.WriteLine(temp);//这里的值是100
            //v1.X = 100;因为加了private修饰符,这里就不能调用了
            Console.WriteLine(v1.X);
            Console.ReadKey();
        }
    }
}

5.自动实现的属性
public int Age{get;set;}
编译器会自动创建private int age属性

namespace _001_调试和错误处理
{
    class Vector3
    {
        //我们定义了一个构造函数,那么编译器不会为我们提供构造函数了
        public Vector3()
        {
            Console.WriteLine("Vector3的构造函数被调用了");
        }
        //定义一个有参数的构造函数
        public Vector3(float x, float y, float z)
        {
            this.x = x;
            this.y = y;
            this.z = z;
            length = Length();
        }
        //编程规范上习惯把所有的字段设置成private,只可以在类内部访问,不可以通过对象访问
        private float x, y, z,length;
        private int age;
        //private string name;
        //public string Name
        //{
        //    get
        //    {
        //        return name;
        //    }
        //    set
        //    {
        //        name = value;
        //    }
        //}
        //相当于上方的简写形式
        public string Name { get; set; }//编译器会自动给我们提供一个字段,来存储name,
        public int Age
        {
            set
            {//通过set方法在设置值之前做一些校验的工作,属性的更多好处,需要在写代码过程中体会
                if (value >= 0)
                {
                    age = value;
                }
            }
        }
        //通过属性设置字段的值
        public float X
        {
            get
            {
                return x;
            }
            //属性的访问修饰符private set
           set//如果在get或者set前面加上private,表示这个块只能在类内部调用
            {
                x = value;
            }
        }
        //为字段提供set方法,来设置字段的值
        public void SetX(float x)
        {
            //如果我们直接在方法内部访问同名的变量,优先访问最近(形参)
            //我们可以通过this.x表示访问的是类的字段或者方法
            this.x = x;
        }
        public void SetY(float y)
        {
            this.y = y;
        }
        public void SetZ(float z)
        {
            this.z = z;
        }
        public float Length()
        {
            return (float)Math.Sqrt(x * x + y * y + z * z);
        }
        //定义属性
        public int MyIntProperty
        {
            set
            {
                Console.WriteLine("属性中set块被调用");//get和set可以只有其中一个
                Console.WriteLine("在set块中访问value的值是:"+value);
            }
            //如果没有get块,就不能通过属性取值了
            get
            {
                Console.WriteLine("属性中的get块被调用");
                return 100;
            }
        }
    }
}
namespace _001_调试和错误处理
{
    class Program
    {
        static void Main(string[] args)
        {
            //Vector3 v1 = new Vector3();
            //v1.x = 1;
            //v1.y = 1;
            //v1.z = 1;//这是讲x,y,z直接在类中public的时候调用的
            //v1.SetX(1);
            //v1.SetY(1);
            //v1.SetZ(1);
            Vector3 v1 = new Vector3(1,1,1);
            //Console.WriteLine(v1.Length());
            //使用属性
            //v1.MyIntProperty = 600;//对属性设置值
            //int temp = v1.MyIntProperty;//对属性取值
            //Console.WriteLine(temp);//这里的值是100
           //v1.X = 100;//因为加了private修饰符,这里就不能调用了
           // Console.WriteLine(v1.X);
            v1.Name = "siki";
            Console.WriteLine(v1.Name);
            Console.ReadKey();
        }
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园建设方案旨在通过融合先进技术,如物联网、大数据、人工智能等,实现校园的智能化管理与服务。政策的推动和技术的成熟为智慧校园的发展提供了基础。该方案强调了数据的重要性,提出通过数据的整合、开放和共享,构建产学研资用联动的服务体系,以促进校园的精细化治理。 智慧校园的核心建设任务包括数据标准体系和应用标准体系的建设,以及信息化安全与等级保护的实施。方案提出了一站式服务大厅和移动校园的概念,通过整合校内外资源,实现资源共享平台和产教融合就业平台的建设。此外,校园大脑的构建是实现智慧校园的关键,它涉及到数据中心化、数据资产化和数据业务化,以数据驱动业务自动化和智能化。 技术应用方面,方案提出了物联网平台、5G网络、人工智能平台等新技术的融合应用,以打造多场景融合的智慧校园大脑。这包括智慧教室、智慧实验室、智慧图书馆、智慧党建等多领域的智能化应用,旨在提升教学、科研、管理和服务的效率和质量。 在实施层面,智慧校园建设需要统筹规划和分步实施,确保项目的可行性和有效性。方案提出了主题梳理、场景梳理和数据梳理的方法,以及现有技术支持和项目分级的考虑,以指导智慧校园的建设。 最后,智慧校园建设的成功依赖于开放、协同和融合的组织建设。通过战略咨询、分步实施、生态建设和短板补充,可以构建符合学校特色的生态链,实现智慧校园的长远发展。
逻辑回归是一种二分类算法,可以用于鉴别红酒的种类。在这里,我们可以使用Sofmax回归算法来预测红酒的产地,并输出uracy,画出ROC曲线。\n\首先,我们需要导入红酒数据。可以使用Siki-r库中的_wi()函数来导入数据,代码如下:\n\```pyth\from sklear.datasets impor _wi\n\rwi = _wi()\x = rwi.\y = rwi.targ\```\n\接下来,我们需要将数据集分为训练集和测试集。可以使用rai_tes_spli()函数来实现,代码如下:\n\```pyth\from sklear.m_selecti impor trai_tes_spli\n\x_trai, x_tes, y_trai, y_tes = trai_tes_spli(x, y, tes_siz=.3, random_s=)\```\n\然后,我们可以使用逻辑回归模型来训练数据集,并进行预测。在这里,我们使用Sofmax回归算法来进行多分类预测,代码如下:\n\```pyth\from sklear.linear_m impor LogistiRegressi\n\r = LogistiRegressi(multi_class='muimi', solver='bfgs')\r.fi(x_trai, y_trai)\y_pr = lr.predi(x_tes)\```\n\最后,我们可以输出模型的准确率和ROC曲线。代码如下:\n\```pyth\from sklear.metrics impor accuracy_scor, r_curv, au\impor matplotlib.pyp as p\n\uracy = accuracy_scor(y_tes, y_pr)\pri(\Accuracy\", accuracy)\n\fpr = di()\pr = di()\r_au = di()\for i i rang(3):\ fpr[i], pr[i], _ = r_curv(y_tes, y_pr, pos_lab=i)\ r_au[i] = au(fpr[i],pr[i])\n\p.figur()\p.p(fpr[], pr[], color='r', lw=2, lab='ROC curv (r = %.2f)' % r_au[])\p.p([, 1], [, 1], color='vy', lw=2, linesty='--')\p.xlim([., 1.])\p.ylim([., 1.05])\p.xlab('Fals Positiv R')\p.ylab('Tru Positiv R')\p.ti('Receiver operating characteristi examp')\p.leg(=\wer righ\")\p.show()\```\n\
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值