c#基础--学习笔记

C#基础

c#集合--Collections

来源:TestAutomation.CSharp.Basics/CSharp.Collections/Collections/Collections_Dictionaries.cs

Arrays集合

创建:

            // defining array with size 5. 
            // But not assigns values
            int[] intArray1 = new int[5];

            // defining array with size 5 and assigning
            // values at the same time
            int[] intArray2 = new int[5] { 1, 2, 3, 4, 5 };

更新:

            string[] cars = { "Volvo", "BMW", "Ford", "Mazda" };
            cars[0] = "Opel";
            Console.WriteLine(cars[0]);

输出:

            // Accessing array values using for loop
            for (int i = 0; i < intArray3.Length; i++)
                Console.WriteLine(" " + intArray3[i]);

            // Accessing array values using foreach loop
            foreach (int i in intArray3)
                Console.WriteLine(" " + i);

排序:

            int[] myNumbers = { 5, 1, 8, 9 };
            Array.Sort(myNumbers);

Dictionary集合

创建c#集合:

方法一

IDictionary<int, string> numberNames = new Dictionary<int, string>();
            numberNames.Add(1, "One"); //adding a key/value using the Add() method
            numberNames.Add(2, "Two");
            numberNames.Add(3, "Three");

方法二

 //creating a dictionary using collection-initializer syntax
            var cities = new Dictionary<string, string>(){
                {"UK", "London, Manchester, Birmingham"},
                {"USA", "Chicago, New York, Washington"},
                {"India", "Mumbai, New Delhi, Pune"}
            };

遍历Dictionary集合:

            foreach (KeyValuePair<int, string> kvp in numberNames)
                Console.WriteLine("Key: {0}, Value: {1}", kvp.Key, kvp.Value);

输出集合内容:

Console.WriteLine(cities["UK"]); //prints value of UK key

查询集合所含键:

 //use ContainsKey() to check for an unknown key
            if (cities.ContainsKey("France"))
            {
                Console.WriteLine(cities["France"]);
            }
 //use TryGetValue() to get a value of unknown key
            string result;

            if (cities.TryGetValue("France", out result))
            {
                Console.WriteLine(result);
            }

            //use ElementAt() to retrieve key-value pair using index
            for (int i = 0; i < cities.Count; i++)
            {
                Console.WriteLine("Key: {0}, Value: {1}",
                                                        cities.ElementAt(i).Key,
                                                        cities.ElementAt(i).Value);
            }

删除集合内容:

            if (cities.ContainsKey("France"))
            { // check key before removing it
                cities.Remove("France");
            }

            cities.Clear(); //removes all elements

Hashtable集合

创建:

Hashtable numberNames = new Hashtable();
numberNames.Add(1, "One"); //adding a key/value using the Add() method

//creating a Hashtable using collection-initializer syntax
            var cities = new Hashtable(){
                {"UK", "London, Manchester, Birmingham"},
                {"USA", "Chicago, New York, Washington"},
                {"India", "Mumbai, New Delhi, Pune"}
            };

遍历:

            foreach (DictionaryEntry de in numberNames)
                Console.WriteLine("Key: {0}, Value: {1}", de.Key, de.Value);

删除

            if (cities.ContainsKey("France"))
            { // check key before removing it
                cities.Remove("France");
            }

            cities.Clear(); //removes all elements

List集合

创建:

            List<int> primeNumbers = new List<int>();
            primeNumbers.Add(1); // adding elements using add() method
            primeNumbers.Add(3);
            var cities = new List<string>();
            cities.Add("New York");
            cities.Add("London");
            //adding elements using collection-initializer syntax
            var bigCities = new List<string>()
                    {
                        "New York",
                        "London",
                        "Mumbai",
                        "Chicago"
                    };
var students = new List<Student>() {
                new Student(){ Id = 1, Name="Bill"},
                new Student(){ Id = 2, Name="Steve"},
                new Student(){ Id = 3, Name="Ram"},
                new Student(){ Id = 4, Name="Abdul"}
            };

            public class Student
            {
                public int Id { get; set; }
                public string Name { get; set; }
            }

查询:

            var numbers = new List<int>() { 10, 20, 30, 40 };
            Assert.IsTrue(numbers.Contains(10)); // returns true

输出:

            List<int> numbers = new List<int>() { 1, 2, 5, 7, 8, 10 };
            Console.WriteLine(numbers[0]); // prints 1

            // using foreach LINQ method
            numbers.ForEach(num => Console.WriteLine(num + ", "));//prints 1, 2, 5, 7, 8, 10,

            // using for loop
            for (int i = 0; i < numbers.Count; i++)
                Console.WriteLine(numbers[i]);
            //get all students whose name is Bill
            var result = from s in students
                         where s.Name == "Bill"
                         select s;

            foreach (var student in result)
                Console.WriteLine(student.Id + ", " + student.Name);

插入:

            var numbers = new List<int>() { 10, 20, 30, 40 };

            numbers.Insert(1, 11);// inserts 11 at 1st index: after 10.

删除:

            var numbers = new List<int>() { 10, 20, 30, 40, 10 };
            numbers.Remove(10); // removes the first 10 from a list
            numbers.RemoveAt(2); //removes the 3rd element (index starts from 0)
            //numbers.RemoveAt(10); //throws ArgumentOutOfRangeException

SortedList:

类似于Dictionary

        public void Lists_SortedLists()
        {
            SortedList<string, string> cities = new SortedList<string, string>()
                                    {
                                        {"London", "UK"},
                                        {"New York", "USA"},
                                        { "Mumbai", "India"},
                                        {"Johannesburg", "South Africa"}
                                    };

            foreach (KeyValuePair<string, string> kvp in cities)
                Console.WriteLine("key: {0}, value: {1}", kvp.Key, kvp.Value);
        }

面向对象:

    public class MyClass
    {
        // Data member/ field
        public string myField = string.Empty;
        public string constructorField = string.Empty;

        // Constructor
        public MyClass()
        {
            constructorField = "Initialised when object is created";
        }

        // Method
        public string MyMethod(int parameter1, string parameter2)
        {
            string myString = ($"First Parameter {parameter1}, second parameter {parameter2}");
            Console.WriteLine(myString);

            return myString;
        }

        // Property
        public int MyAutoImplementedProperty { get; set; }

        private string myPropertyVar;

        // Custom Property
        public string MyProperty
        {
            get { return myPropertyVar; }
            set { myPropertyVar = value; }
        }
    }
}

继承

  // Base class
    class base_Shape
    {
        protected int width;
        protected int height;
        protected int radius;
        public void setWidth(int w)
        {
            width = w;
        }
        public void setHeight(int h)
        {
            height = h;
        }

        public void setRadius(int r)
        {
            radius = r;
        }
    }

    // Derived class
    class derived_Rectangle : base_Shape
    {
        public int getArea()
        {
            return (width * height);
        }
    }

    // Derived class
    class derived_Circle : base_Shape
    {
        public double getArea()
        {
            return (3.14 * radius * radius);
        }
    }

抽象类:

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Abstraction;

namespace CSharp.OOPs.OOPs
{
    [TestClass]
    public class OOPs_Abstraction
    {
        [TestMethod]
        public void OOPs_AbstractionImplementation()
        {
            Rectangle r = new Rectangle(10, 7);
            double a = r.area();
            Console.WriteLine("Area: {0}", a);
            Assert.AreEqual(70, r.area());
        }
    }
}

namespace Abstraction
{
    abstract class Shape
    {
        public abstract int area();
    }

    class Rectangle : Shape
    {
        private int length;
        private int width;

        public Rectangle(int a = 0, int b = 0)
        {
            length = a;
            width = b;
        }
        public override int area()
        {
            Console.WriteLine("Rectangle class area :");
            return (width * length);
        }
    }    
}

多态

网址:https://docs.microsoft.com/zh-cn/dotnet/csharp/fundamentals/object-oriented/polymorphism


1)运行时派生类被视为基类

2)通过派生类重写基类的虚方法实现多态

public class Shape
{
    // A few example members
    public int X { get; private set; }
    public int Y { get; private set; }
    public int Height { get; set; }
    public int Width { get; set; }

    // Virtual method
    public virtual void Draw()
    {
        Console.WriteLine("Performing base class drawing tasks");
    }
}

public class Circle : Shape
{
    public override void Draw()
    {
        // Code to draw a circle...
        Console.WriteLine("Drawing a circle");
        base.Draw();
    }
}
public class Rectangle : Shape
{
    public override void Draw()
    {
        // Code to draw a rectangle...
        Console.WriteLine("Drawing a rectangle");
        base.Draw();
    }
}
public class Triangle : Shape
{
    public override void Draw()
    {
        // Code to draw a triangle...
        Console.WriteLine("Drawing a triangle");
        base.Draw();
    }
}

3)通过"foreach "遍历派生类

var shapes = new List<Shape>
{
    new Rectangle(),
    new Triangle(),
    new Circle()
};

// Polymorphism at work #2: the virtual method Draw is
// invoked on each of the derived classes, not the base class.
foreach (var shape in shapes)
{
    shape.Draw();
}

4)虚方法的覆盖:

a. 派生类可以覆盖基类中的虚拟成员,定义新的行为。

b. 派生类继承最近的基类方法而不覆盖它,保留现有行为但允许进一步的派生类覆盖该方法。

c. 派生类可以定义那些隐藏基类实现的成员的新的非虚拟实现

5)用新成员隐藏基类成员

new 关键字覆盖虚方法

public class BaseClass
{
    public void DoWork() { WorkField++; }
    public int WorkField;
    public int WorkProperty
    {
        get { return 0; }
    }
}

public class DerivedClass : BaseClass
{
    public new void DoWork() { WorkField++; }
    public new int WorkField;
    public new int WorkProperty
    {
        get { return 0; }
    }
}

强制向上转型,调用基类方法

DerivedClass B = new DerivedClass();
B.DoWork();  // Calls the new method.

BaseClass A = (BaseClass)B;
A.DoWork();  // Calls the old method.

6)防止派生类覆盖虚拟成员

在类成员声明中将sealed 关键字放在override 关键字之前。

public class C : B
{
    public sealed override void DoWork() { }
}

8)从派生类访问基类虚拟成员

public class Base
{
    public virtual void DoWork() {/*...*/ }
}
public class Derived : Base
{
    public override void DoWork()
    {
        //Perform Derived's work here
        //...
        // Call DoWork on base class
        base.DoWork();
    }
}

使用:

 public void OOPs_Polymorhism_Dynamic()
        {
            Caller c = new Caller();
            Rectangle r = new Rectangle(10, 7);
            Triangle t = new Triangle(10, 5);

            c.CallArea(r);
            Assert.AreEqual(70, c.CallArea(r));

            c.CallArea(t);
            Assert.AreEqual(25, c.CallArea(t));
        }

接口

namespace TestAutomation.CSharp.OOPs
{
    interface IFile
    {
        void ReadFile();
        void WriteFile(string text);
    }
}
    public class FileInfo : IFile
    {
        public void ReadFile()
        {
            Console.WriteLine("Reading File");
        }

        public void WriteFile(string text)
        {
            Console.WriteLine("Writing to file");
        }

        public void InterfaceImplement()
        {
            IFile file1 = new FileInfo();
            FileInfo file2 = new FileInfo();

            file1.ReadFile();
            file1.WriteFile("content");

            file2.ReadFile();
            file2.WriteFile("content");
        }
    }

数据类型

显示转换

            int num1 = 10;
            int num2 = 4;
            double num3 = (double)num1 / num2;
            int num1 = 10;
            int num2 = 4;
            double num3 = Convert.ToDouble(num1) / Convert.ToDouble(num2);

            var checkFalse = Convert.ToBoolean(2 - 2);

            decimal decimalVal;
            string stringVal = "2,345.26";
            decimalVal = Convert.ToDecimal(stringVal);

            string dateString = "05/01/1996";
            ConvertToDateTime(dateString);

  //日期转换         
		string dateString = "05/01/1996";
         ConvertToDateTime(dateString);

		private static void ConvertToDateTime(string value)
        	{
            DateTime convertedDate;
            try
            {
                convertedDate = Convert.ToDateTime(value);
                Console.WriteLine("'{0}' converts to {1} {2} time.",
                                  value, convertedDate,
                                  convertedDate.Kind.ToString());
            }
            catch (FormatException)
            {
                Console.WriteLine("'{0}' is not in the proper format.", value);
            }
        }

隐式转换

由 C# 以类型安全的方式执行。例如,从较小到较大的整数类型的转换以及从派生类到基类的转换

            int num1 = 10;
            double num2 = 15.8;
            var num3 = num1 + num2;//num3 == 25.8
            int num1 = 10;
            int num2 = 4;
            double num3 = num1 / num2;//num3 == 2
            int age = 30;
            Console.WriteLine($"My age is {age}");//My age is 30
上一篇:c#爬取笔趣阁小说(附源码)


下一篇:c# 支持热插拔的插件