zoukankan      html  css  js  c++  java
  • 学习笔记静态方法调用,多肽,操作符重载,3中参数传递方式,二维数组与交错数组

    1. 静态的方法只能调用其他静态的方法, 实例可以调用静态方法, 但需要仔细设计.(静态的只能调用静态的, 实例的可以调用静态的)


    2. 方法使用动词或动词词组命名, 所有独立单词的首字母大写, 但private方法的第一个单词的字母可以小写, 也可以大写.

    3.  多肽使用原则:
       a. 要分清楚容器的类型和实例的类型: 多肽中, 容器的类型通常为基类型及接口.
       b. 容器类型和实例类型之间的关系.
          1). 同种类型容器可以控制同类型实例
          2). 上层类型容器可以隐式控制下层类型实例
          3). 同为某继承关系中的同层类型, 彼此不可以相互控制
          4). 下层类型容器不可以隐式控制上层类型容器所控制的实例. 如果上层类型容器中所控制的实例类型符合下层类型容器的规范, 则可以使用强制转换达到控制目的, 否则失败.

    4. 操作符重载: 在不改变操作符原意的情况下, 括大操作符的运算范围. 注意: 操作符的重载方法必须是在类中的静态方法, 且重载方法的参数是累的实例.

    代码
    class Person
    {
    private int _weight = 0;
    public int Weigth
    {
    get
    {
    return this._weight;
    }
    set
    {
    this._weight = value;
    }
    }

    public static int operator +(Person p1, Person P2)
    {
    return p1.Weigth + P2.Weigth;
    }
    }

    class Program
    {
    static void Main(string[] args)
    {
    Person zs
    = new Person();
    zs.Weigth
    = 100;

    Person ls
    = new Person();
    ls.Weigth
    = 150;

    int result = zs + ls;
    Console.WriteLine(result);
    }
    }

    5. 三中参数传递方式: 值传参, 引用传参(ref传参, 需要提前初始化), 输出传参(out传参, 可以提前初始化, 也可以在方法内部初始化). 严格数来: 传递参数的方式只有两种: 值传参和地址(引用)传参, 其中地址(引用)传参包含ref传参和out传参

    代码
    class Demo
    {
    static void Main(string[] args)
    {
    #region 值传参(传递值, 数据副本)
    string province = "北京";
    string avgweather = "晴转多云";
    int avgtemp = 32;
    showMsg(province, avgweather, avgtemp);
    Console.WriteLine(
    "--------------------------------------------\n");
    #endregion

    while (true)
    {
    Console.Write(
    "请输入您要查询的区县名称(输入EXIT退出): ");
    string name = Console.ReadLine().Trim();
    if (name.ToLower() == "exit")
    {
    Console.WriteLine(
    "感谢使用, 再见!");
    break;
    }
    else
    {
    #region 引用传参(传递地址)
    string weather = "尚未获取数据";//输入参数, 必须在外部先进行初始化
    int temp;//未初始化, 输出参数可以在外部进行初始化, 也可以在调用方法内部进行初始化

    Console.WriteLine(
    "\n-------------" + name + "-----------------");
    queryWeather(name,
    ref weather);//输入参数传参, ref传参
    queryTemp(name, out temp);//输出参数传参, out 传参
    showMsg(name, weather, temp);
    #endregion
    }
    }
    }

    //注意: 这里的三个方法全是void无返回值的方法
    private static void showMsg(string name, string weather, int temp)
    {
    Console.WriteLine(
    string.Format("< {0} >天晴情况为: < {1} >,平均气温为< {2} >",name,weather,temp));
    }

    private static void queryWeather(string name, ref string weather)
    {
    switch(name)
    {
    case "海淀":
    weather
    = "多云";
    break;
    case "西城":
    weather
    = "大到暴雨";
    break;
    case "朝阳":
    weather
    = "雨夹雪";
    break;
    case "崇文":
    weather
    = "雷阵雨";
    break;
    case "延庆":
    weather
    = "冰雹";
    break;
    case "昌平":
    weather
    = "大风6-7级";
    break;
    case "丰台":
    weather
    = "晴天";
    break;
    case "平谷":
    weather
    = "暴雪";
    break;
    case "顺义":
    weather
    = "多云";
    break;
    case "大兴":
    weather
    = "暴风雨敬告";
    break;
    default:
    weather
    = "不属于北京辖区, 天气未知, 建议撤离!";
    break;
    }
    }

    private static void queryTemp(string name, out int temp)
    {
    Random ran
    = new Random();
    temp
    = ran.Next(0,40);
    }
    }

    6. c#中二维数组和交错数组分配内存的方式:
    假设有二维数组定义(m,n都是整数数字) 和交错数组定义(假设交错数组的每一维度长度都是n):

    int[,] intary = new int[m,n];

    int[][] jaggedary = new int[m][];
    for(int i=0;i<m;i++)
    {
    jaggedary[i]
    = new int[n];
    }

    则:

        二维数组在内存中, 先开辟一个大小为m*n的空间(实际所占字节数为m*n*整数的4字节), 然后将该块存储空间m等分, 每一分的大小恰好为n; 也就是说二维数组是先在内存中分配完m*n的空间后, 在通过等分确定每一维度的大小, 如果输出intary.Length的话, 其值为m*n.
        而交错数组现在内存中开辟一块大小为m*4(地址或者说引用占4字节), 然后m块中的每一块存放另外一个长度为n的一维数组的引用. 当然这里只是便于表述, 这个一维数组可以使任何长度大于或小于n的数组

    因此:

         获得二维数组的维度不能使用Length属性, intary.Length实际得到的是整个二维数组所占的空间, 而应该使用intary.GetLength(0);获得第一维的长度, 即行数; 通过intary.GetLength(1)获得第二位的长度, 即列数.
          对于交错数组, 可以直接使用jaggedary.Length获得第一维的维度, 通过jaggedary[i].Length获得第二维的维度. 更多维数的数组类似.

  • 相关阅读:
    前端全链路优化总结
    到底使用字符数组还是字符串常量
    指针的误区
    指针
    函数使用初体验
    C语言函数使用小试牛
    十年研发经验工程师的嵌入式学习书籍大推荐与学习进阶路线
    TCP/IP协议前期的一知半解
    Ubuntu 16.04 LTS安装sogou输入法详解
    1/0信封——数据链路层,ARP及RARP
  • 原文地址:https://www.cnblogs.com/cs_net/p/1828479.html
Copyright © 2011-2022 走看看