遵从CLS

首先,让我们来简单地看下什么叫做CLS。

鉴于个人的英文水平,我还是先给出CLS的英文解释,然后我再翻译:

The CLS is a specification that defines the rules to support language integration. This is done in such a way, that programs written in any language (.NET compliant) can interoperate with one another. This also can take full advantage of inheritance, polymorphism, exceptions, and other features.

CLS定义了支持语言继承的规范,他使我们所写的程序可以于任何一门.NET所兼容的语言交互,这使我们也可以充分利用继承,多态,异常以及其他一些特点的优势。

其实简化了说,CLS就是定义了个门语言的子集,从而去保证语言的互操作性。

因此,为了语言之间的互操作,我们应该使我们的程序遵从CLS。

我们看一下系统的层次,系统下应该是程序集,程序集下就是类(或结构体等)。那么我们为了保证语言的互操作性,就应该保证程序集对外的部分都遵从CLS。

这点很容易保证:

当我们新建一个程序集的时候,有一个文件叫做:AssemblyInfo.cs:

[assembly: AssemblyTitle("ClassLibrary1")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("微软中国")]
[assembly: AssemblyProduct("ClassLibrary1")]
[assembly: AssemblyCopyright("Copyright © 微软中国 2009")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]

// 将 ComVisible 设置为 false 使此程序集中的类型
// 对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型,
// 则将该类型上的 ComVisible 属性设置为 true。
[assembly: ComVisible(false)]

// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
[assembly: Guid("694543e8-4c7f-4952-9e98-7282ecff1c15")]

// 程序集的版本信息由下面四个值组成:
//
//      主版本
//      次版本 
//      内部版本号
//      修订号
//
// 可以指定所有这些值,也可以使用“内部版本号”和“修订号”的默认值,
// 方法是按如下所示使用“*”:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
毫无疑问,这里记录的都是当前程序集的信息,那么我们只需要在里面加上一行代码:
[assembly:System.CLSCompliant(true)]

这样程序就保证了整个程序集满足CLS规范。

当我们写一段不满足CLS的程序时:

namespace ClassLibrary1
{
    public class People
    {
        private string name;
        private uint age;   //uint不满足CLS
        public uint Age
        {
            get
            {
                return age;
            }
        }
        public People(string name)
        {
            this.name = name;
        }
    }
}

当我们生成程序集的时候,报出了这样的警告:

image

当然,我再对这个做一些附加的解释,希望不是画蛇添足:

我们都知道,一个程序集存在一些对外的接口,其他的程序集只是与这些对外的接口进行交互,也就是说只要对外的接口满足CLS,这个程序集就可以进行与其他语言的互操作了:

看一个例子,当我们把上述的class People设置为默认的访问修饰符internal时:

class People
{
    private string name;
    private uint age;   //uint不满足CLS
    public uint Age
    {
        get
        {
            return age;
        }
    }
    public People(string name)
    {
        this.name = name;
    }
}

这个时候,当我生成程序集的时候,并不会报CLS不兼容的错误:

image

因此,我不想再去说哪些类需要满足CLS。我们只需要记住,如果你写的某个类,或者变量,方法,在程序集可以访问到,那么这个类,方法,变量就需要满足CLS。

当然,有这样一种情况,就是说使用了不满足CLS的方法,变量等会极大提高整个程序的可读性,那么我们就该为这个方法,或者变量等实现一个与其等义的方法等,于是,如果访问该程序集的是同一语言,那么便访问该方法,否则便访问替代方法。

另外,有一种能力叫做取舍。我们不可能做出一个十全十美的项目,人力不允许,物力不允许,精力也不允许,因此,我们必须要放弃一些东西。当我们这个项目基本不太可能与其他语言进行交互时,那么我就没有必要将精力去集中在项目程序集是否满足于CLS上。

当然,如果我们有时间,那么抽出些时间去搞定语言的互操作,还是利大于弊的!

内容概要:本文介绍了一种基于蒙特卡洛模拟和拉格朗日优化方法的电动汽车充电站有序充电调度策略,重点针对分时电价机制下的分散式优化问题。通过Matlab代码实现,构建了考虑用户充电需求、电网负荷平衡及电价波动的数学模【电动汽车充电站有序充电调度的分散式优化】基于蒙特卡诺和拉格朗日的电动汽车优化调度(分时电价调度)(Matlab代码实现)型,采用拉格朗日乘子法处理约束条件,结合蒙特卡洛方法模拟大量电动汽车的随机充电行为,实现对充电功率和时间的优化分配,旨在降低用户充电成本、平抑电网峰谷差并提升充电站运营效率。该方法体现了智能优化算法在电力系统调度中的实际应用价值。; 适合人群:具备一定电力系统基础知识和Matlab编程能力的研究生、科研人员及从事新能源汽车、智能电网相关领域的工程技术人员。; 使用场景及目标:①研究电动汽车有序充电调度策略的设计与仿真;②学习蒙特卡洛模拟与拉格朗日优化在能源系统中的联合应用;③掌握基于分时电价的需求响应优化建模方法;④为微电网、充电站运营管理提供技术支持和决策参考。; 阅读建议:建议读者结合Matlab代码深入理解算法实现细节,重点关注目标函数构建、约束条件处理及优化求解过程,可尝试调整参数设置以观察不同场景下的调度效果,进一步拓展至多目标优化或多类型负荷协调调度的研究。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值