30天C#基础巩固------面向鸭子编程,关于string和File的练习

简介: 30天C#基础巩固------面向鸭子编程,关于string和File的练习

 面向对象编程就是面向抽象的父类进行编程,具体的实现不用考虑,由子类决定。


<经典的说法--面向鸭子编程>


eg:鸭子的编程,<对于多态的理解>


   我们都习惯把使用两条腿两边走的动物,形象的叫做鸭子。这里我们的本来的鸭子就是父类(抽象类),继承且实现方法的叫做子类,就是我们把走路和鸭子一样的都叫做鸭子一样。(木头鸭子,橡皮鸭子,真实的鸭子)。


接口:鸭子叫,鸭子游泳。


//鸭子大叫
public interface IBark
{
    void Bark();
}


//鸭子游泳接口
public interface ISwitch
{
    void Switch();//接口只管定义方法,不用管实现。
}


真实鸭子,木头鸭子,橡皮鸭子

//真鸭子,即会游泳又回叫
public class RealDuck:Duck,IBark
{
    public void Bark()
    {
        Console.WriteLine("嘎嘎嘎嘎嘎嘎嘎------");
    }
    public override void Switch()
    {
        Console.WriteLine("真实的鸭子----自由自在的游泳.....");
    }
}



//橡皮鸭子,继承鸭子,只会叫。
public class RubbleDuck:Duck,IBark
{
    public void Bark()
    {
        Console.WriteLine("叽叽叽叽....");
    }
    public override void Switch()
    {
        Console.WriteLine("橡皮鸭子--,漂浮在水上。");
    }
}
//木头鸭子
public class WoodDuck:Duck
{
    public override void Switch()
    {
        Console.WriteLine("木头鸭子,漂浮在水上。");
    }
}


main()方法中的。


  /// <summary>
    /// 面向鸭子编程----->理解多态
    /// </summary>
    /// <param name="args"></param>
    static void Main(string[] args)
    {
        //父类定义方法,子类具体实现(每个鸭子游泳是不一样的。)
        Duck d1=new RealDuck();    
        Duck d2=new RubbleDuck();   
        Duck d3=new WoodDuck();
        Console.WriteLine("……………01.鸭子游泳………...…");
        //三个鸭子的游泳都不一样
        d1.Switch();
        d2.Switch();
        d3.Switch();
        Console.WriteLine("……………02.鸭子的叫声……………");
        //把抽象类给了接口IBark,(利用了里氏转换原则)
        IBark i1 = d1 as IBark;         
        if (i1!=null) i1.Bark();          //会叫,嘎嘎嘎嘎
        IBark i2 = d2 as IBark;
        if (i2!=null)
        {
            i2.Bark();                      //会叫,叽叽
        }
        IBark i3 = d3 as IBark;
        if (i3!=null)
        {
            i3.Bark();                 //不会叫,没有实现ibark接口,而且木头鸭子本身就不会叫。
        }
        Console.ReadKey();
    }
}


上面我们把鸭子Duck定义为抽象的类,里面我们只是定义了方法,具体的实现在子类中。就是我们前面说的那样,父类定义方法,子类继承实现,这就是具体的实现在子类,每个都是不一样的。


下面的那个利用里氏转换原理,把父类Duck转换为接口IBark,只要实现了接口,他就会拥有里面叫的方法。


679140-20160523204249522-1634547865.png


反转字符串


//将字符串反转。
Console.WriteLine("请输入一个字符串?");
string input = Console.ReadLine();
char[] chs= input.ToCharArray();        //将string类型转换为数组
for (int i = 0; i <chs.Length/2; i++)     //反转只需要执行1/2次数就可以。
{
    char cTemp = chs[i];
    chs[i] = chs[chs.Length-1-i];        //第一个和最后一个转换
    chs[chs.Length - 1 - i] = cTemp;
}
Console.WriteLine(new string(chs));          //把char数组又转换为string类型。
Console.ReadKey();

679140-20160523204251694-1148595827.png



读取phone.csv文件并且输出来。


       string[] lines = File.ReadAllLines("phone.csv", Encoding.Default);       //按行读取Debug文件下面
       //的csv文件,放到数组里面。
       for (int i = 0; i < lines.Length; i++)
       {
           string[ ] ts = lines[i].Split(',');
           Console.WriteLine("姓名:{0}",ts);           
       }
Console.ReadKey();


读取文件利用File.ReadAllLines(“文件名”,Encoding.Default);,这个是读取项目文件中Debug目录下的文件,按行读取值,放到string[]数组中.


679140-20160523204253584-1963083278.png


利用键值对来保存我们读取到字符串中的年月日下标。


string src = "1993年10月08日";
Dictionary<char,int>  dic=new Dictionary<char, int>();              //声明一个键值对。
int index = -1;
do
{
    //显示这3个字符的位置下标。
    index = src.IndexOfAny("年月日".ToCharArray(), index + 1);  //将字符串"年月日"转换为char数组,循环的输出每个下标。
    if (index!=-1)
    {
        //Console.WriteLine(index);                     
        dic.Add(src[index],index);
    }                
} while (index!=-1);
//循环输出键值对中的值,注意这里的KeyValuePair<char, int>类型,不是我们以前的var。
foreach (KeyValuePair<char, int> item in dic)
{
    Console.WriteLine(item.Key+"  "+item.Value);
}
Console.ReadKey();

679140-20160523204255303-1677309921.png



目录
相关文章
|
13天前
|
C# 开发者
C# 一分钟浅谈:Code Contracts 与契约编程
【10月更文挑战第26天】本文介绍了 C# 中的 Code Contracts,这是一个强大的工具,用于通过契约编程增强代码的健壮性和可维护性。文章从基本概念入手,详细讲解了前置条件、后置条件和对象不变量的使用方法,并通过具体代码示例进行了说明。同时,文章还探讨了常见的问题和易错点,如忘记启用静态检查、过度依赖契约和性能影响,并提供了相应的解决建议。希望读者能通过本文更好地理解和应用 Code Contracts。
28 3
|
1月前
|
Java
【编程基础知识】(讲解+示例实战)方法参数的传递机制(值传递及地址传递)以及String类的对象的不可变性
本文深入探讨了Java中方法参数的传递机制,包括值传递和引用传递的区别,以及String类对象的不可变性。通过详细讲解和示例代码,帮助读者理解参数传递的内部原理,并掌握在实际编程中正确处理参数传递的方法。关键词:Java, 方法参数传递, 值传递, 引用传递, String不可变性。
51 1
【编程基础知识】(讲解+示例实战)方法参数的传递机制(值传递及地址传递)以及String类的对象的不可变性
|
1月前
|
Java
【编程基础知识】switch case可以用string(千万注意要加上break)
本文详细探讨了Java中`switch`语句使用字符串时的注意事项,重点讲解了`break`语句的重要性。通过代码示例和流程图,帮助读者正确理解和使用`switch`语句,避免常见的编程错误。
79 4
|
1月前
|
安全 Java
【编程基础知识】《Java 字符串大揭秘:String、StringBuffer 与 StringBuilder 的精彩较量》
本文详细解析了 Java 中的 String、StringBuffer 和 StringBuilder 三个字符串处理类,通过特点、用法及代码示例,帮助读者理解它们在不同场景下的应用,提升字符串处理效率。
16 2
|
1月前
|
安全 C# 数据安全/隐私保护
实现C#编程文件夹加锁保护
【10月更文挑战第16天】本文介绍了两种用 C# 实现文件夹保护的方法:一是通过设置文件系统权限,阻止普通用户访问;二是使用加密技术,对文件夹中的文件进行加密,防止未授权访问。提供了示例代码和使用方法,适用于不同安全需求的场景。
101 0
|
2月前
|
API C#
C# 一分钟浅谈:文件系统编程
在软件开发中,文件系统操作至关重要。本文将带你快速掌握C#中文件系统编程的基础知识,涵盖基本概念、常见问题及解决方法。文章详细介绍了`System.IO`命名空间下的关键类库,并通过示例代码展示了路径处理、异常处理、并发访问等技巧,还提供了异步API和流压缩等高级技巧,帮助你写出更健壮的代码。
41 2
|
2月前
|
SQL 开发框架 安全
并发集合与任务并行库:C#中的高效编程实践
在现代软件开发中,多核处理器普及使多线程编程成为提升性能的关键。然而,传统同步模型在高并发下易引发死锁等问题。为此,.NET Framework引入了任务并行库(TPL)和并发集合,简化并发编程并增强代码可维护性。并发集合允许多线程安全访问,如`ConcurrentQueue&lt;T&gt;`和`ConcurrentDictionary&lt;TKey, TValue&gt;`,有效避免数据不一致。TPL则通过`Task`类实现异步操作,提高开发效率。正确使用这些工具可显著提升程序性能,但也需注意任务取消和异常处理等常见问题。
48 1
|
2月前
|
安全 数据库连接 API
C#一分钟浅谈:多线程编程入门
在现代软件开发中,多线程编程对于提升程序响应性和执行效率至关重要。本文从基础概念入手,详细探讨了C#中的多线程技术,包括线程创建、管理及常见问题的解决策略,如线程安全、死锁和资源泄露等,并通过具体示例帮助读者理解和应用这些技巧,适合初学者快速掌握C#多线程编程。
78 0
|
2月前
|
Java 索引
java基础(13)String类
本文介绍了Java中String类的多种操作方法,包括字符串拼接、获取长度、去除空格、替换、截取、分割、比较和查找字符等。
38 0
java基础(13)String类
|
27天前
|
安全 Java 测试技术
Java零基础-StringBuffer 类详解
【10月更文挑战第9天】Java零基础教学篇,手把手实践教学!
24 2