第三周——UML/C#高级编程

本文详细介绍了UML的各种视图,包括用例图、类图、状态图、活动图、时序图、协作图、构件图和部署图。接着探讨了C#的高级特性,如特性、反射、委托、匿名方法、Lambda表达式、事件、扩展方法以及LINQ的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、UML图

一)分类:

1)用例视图——用例图

  • 是谁用软件。软件的功能。
  • 从用户的角度描述了系统的功能,并指出各个功能的执行者,强调用户的使用者,系统为执行者完成哪些功能。
    在这里插入图片描述

2)设计视图:

1、类图
  1. 用户根据用例图抽象成类,描述类的内部结构和类与类之间的关系,是一种静态结构图。
    在这里插入图片描述
  • 泛化(Generalization):
    在这里插入图片描述

  • 实现(Realization)
    在这里插入图片描述

  • 关联(Association)
    在这里插入图片描述

  • 聚合(Aggregation)
    在这里插入图片描述

  • 组合(Composition)
    在这里插入图片描述

  • 依赖(Dependency)
    在这里插入图片描述

2、对象图
  1. 描述的是参与交互的各个对象在交互过程中某一时刻的状态。对象图可以被看作是类图在某一时刻的实例
    在这里插入图片描述
    在这里插入图片描述

3)进程视图:

1、状态图
  1. 状态图是用来描述不同的对象在其生命周期的状态。因此,强调的是一些内部或外部事件的状态发生变化时,这些对象的状态要重要的分析和准确的贯彻落实。
    在这里插入图片描述
2、活动图
  1. 是状态图的一种特殊情况,这些状态大都处于活动状态。本质是一种流程图,它描述了活动到活动的控制流。
  2. 活动图则强调的是从活动到活动的控制流。
  • 一般活动图
    在这里插入图片描述
  • 带泳道的活动图:泳道表明每个活动是由哪些人或哪些部门负责完成。
    在这里插入图片描述
  • 带对象流的活动图:把涉及到的对象放置在活动图中,并用一个依赖将其连接到进行创建、修改和撤销的动作状态或者活动状态上。
    在这里插入图片描述
3、时序图
  • 描述了对象之间消息发送的先后顺序,强调时间顺序。
  • 消息用从一个对象的生命线到另一个对象生命线的箭头表示。箭头以时间顺序在图中从上到下排列。
    在这里插入图片描述
4、协作图
  • 描述了收发消息的对象的组织关系,强调对象之间的合作关系。时序图按照时间顺序布图,而写作图按照空间结构布图
    在这里插入图片描述

4)实现视图——构件图

  • 构件图是用来表示系统中构件与构件之间,类或接口与构件之间的关系图
  • 构建之间的关系表现为依赖关系,定义的类或接口类之间的关系表现为依赖关系或实现关系
  • 在这里插入图片描述

5)拓扑视图——部署图

  • 描述了系统运行时进行处理的结点以及在结点上活动的构件的配置。强调了物理设备以及之间的连接关系
  • 在这里插入图片描述

二、C#高级编程

一)特性(Attribute)

  1. 定义:
    – 是一种标签,能够对代码(程序集、类型、方法、属性等)进行声明,这些声明被封装成元数据添加到程序。
    – 可通过反射来获取某代码的特性。
    – 特性可自定义。
[Serializable]
public class SampleClass
{
    // Objects of this type can be serialized.
}

二)反射(Reflection)

  1. 定义:
    – 通过反射来检索某代码的特性信息。
    – 主要方法: GetCustomAttributes,它返回对象数组。
  2. 以下代码实现了
    – 自定义特性
    – 通过反射获取特性信息
using System;


/// <summary>
/// 定义自定义特性
/// Author特性:name姓名;version版本
/// </summary>
[System.AttributeUsage(System.AttributeTargets.Class |
                   System.AttributeTargets.Struct,
                   AllowMultiple = true)  // Multiuse attribute.  
]
public class Author : System.Attribute
{
    public string Name { set; get; }
    public double Version { set; get; }
    //构造函数,默认版本1.0
    public Author(string name)
    {
        this.Name = name;
        this.Version = 1.0;
    }
}
[Author("W.ang")]
public class FirstClass { }
[Author("W.ang"), Author("C.hao", Version = 2.0)]
public class SecondClass { }

public class Test
{

    /// <summary>
    /// 通过Type反射回类别信息,打印其中特性信息
    /// </summary>
    /// <param name="t"></param>
    public static void PrintAuthorInfo(System.Type t)
    {
        System.Console.WriteLine("Author information for {0}", t);

        // Using reflection.  
        System.Attribute[] attrs = System.Attribute.GetCustomAttributes(t);  // 反射操作

        // Displaying output.  
        foreach (System.Attribute attr in attrs)
        {
            if (attr is Author)
            {
                Author a = (Author)attr;
                System.Console.WriteLine("   {0}, version {1:f}", a.Name, a.Version);
            }
        }
    }
    public static void Main(string[] args)
    {
        PrintAuthorInfo(typeof(FirstClass));
        PrintAuthorInfo(typeof(SecondClass));
    }
}

在这里插入图片描述

三)委托(Delegate)

  1. 概述:能够引用特定参数和返回值的方法,也就是说将方法作为参数传递给其他方法。
  2. 委托对象通常通过提供委托将封装的方法的名称使用匿名函数来进行构造
//C#1.0和更高版本中
// Declare a delegate.
delegate void Del(string str);

// Declare a method with the same signature as the delegate.
static void Notify(string name)
{
    Console.WriteLine($"Notification received for: {name}");
}

// Create an instance of the delegate.
Del del1 = new Del(Notify);
// C# 2.0 provides a simpler way to declare an instance of Del.
Del del2 = Notify;

四)匿名方法

  1. 概述:
    – 提供了一种传递代码块作为委托参数的技术。匿名方法是没有名称只有主体的方法。
    – 通过委托来实现
//C#2.0+
// Declare a delegate.
delegate void Del(string str);
// Instantiate Del by using an anonymous method.
Del del3 = delegate(string name)
    { Console.WriteLine($"Notification received for: {name}"); };

五)Lambda

  1. lambda表达式是一个未命名的方法,代替一个委托实例。
  2. 使用空括号指定零个输入参数:() => { };
//C#3.0+
// Declare a delegate.
delegate void Del(string str);
// Instantiate Del by using a lambda expression.
Del del4 = name =>  { Console.WriteLine($"Notification received for: {name}"); };

六)事件(Event)

  1. 建立在委托之上,是后期绑定机制。
  2. 事件是对象用于(向系统中的所有相关组件)广播已发生事情的一种方式。

一、定义事件
定义事件时,发生者首先要定义委托,然后根据委托定义事件。
二、订阅事件
定义好事件后,与事件有关的人会订阅事件,只有订阅事件的对象才会收到发生事件的通知,没有订阅该事件的对象则不会收到通知。
事件名+=new 委托名(方法名);。
三、引发事件
事件发生时,调用其委托的方法。

using System;

namespace Example_EventTest
{
    class Judgment
    {
        //定义一个委托
        public delegate void delegateRun();
        //定义一个事件
        public event delegateRun eventRun;
        //引发事件的方法
        public void Begin()
        {
            eventRun();//被引发的事件
        }
    }
    class RunSports
    {
        //定义事件处理方法
        public void Run()
        {
            Console.WriteLine("运动员开始比赛");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            RunSports runsport = new RunSports();//实例化事件发布者
            Judgment judgment = new Judgment();//实例化事件订阅者
            //订阅事件
            judgment.eventRun += new Judgment.delegateRun(runsport.Run);
            //引发事件
            judgment.Begin();
            Console.ReadKey();
        }
    }
}

七)扩展方法

  1. 扩展方法被定义为静态方法(静态类中),但它们是通过实例方法语法进行调用的。
  2. 它们的第一个参数指定方法操作的类型,this修饰。
  3. 仅当使用 using 指令将命名空间显式导入到源代码中之后,扩展方法才位于范围中。

八)LINQ

  1. 方法语法:扩展方法 + lambda表达式;
  2. 声明式的查询语法类似于SQL查询方式。
  • . 方法语法(传输链):
IEnumerabl<T>query=源集合.Where(过滤,必须bool表达式).OrderBy(排序条件).Select(选择条件)
  • . 查询表达式:
var 结果集 = from n in 数据源  wher 过滤表达式 orderby 排序 select 投影(选择)
//查询表达式需以select或者group结束!

Sum、Max/Min、ForEach、Where、OrderBy、ToLookup/GroupBy、Join
C#总结三linq——https://blog.youkuaiyun.com/u010773333/article/details/81067598

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值