小编Luc*_*key的帖子

析构函数执行顺序?

我知道c#中的Destructors没有执行顺序.

我在几个类中使用以下结构,它是Desturct实例和静态信息:

public class MyClass
{
    private static readonly Destructor DestructorObject = new Destructor();

    ~MyClass()
    {
        Console.WriteLine("Destructor Called");
    }

    static void Main(string[] args)
    {
        var myClass = new MyClass();
    }

    private sealed class Destructor
    {
        ~Destructor()
        {
            Console.WriteLine("Static Destructor Called");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

正如我上面提到的,Destuctors的顺序是一个统一的.但是当我在许多类中使用这个构造时,我发现,在每个类中都有一个不变的顺序,即使我重新编译应用程序并再次运行它也会保留.

意味着a MyClass1alaways可能首先运行~MyClass1而另一个类MyClass2可能首先运行~Destructor.

由于每个班级显然都有"隐藏"的订单,我能相信吗?

c# destructor

3
推荐指数
1
解决办法
835
查看次数

XmlSerialisation:将属性序列化为另一个属性的属性

给定一个可序列化的类,其中包含许多要序列化的属性,我希望它们中的一些属于另一个属性.

样品

序列化类似的类

[Serializeable]
public class MySerializeableClass {

    public string AnyPath { get; set; }

    public bool IsActive { get; set; }

}
Run Code Online (Sandbox Code Playgroud)

结果将是

<MySerializeableClass>
    <AnyPath>C:\</AnyPath>
    <IsActive>true</IsActive>
</MySerializeableClass>
Run Code Online (Sandbox Code Playgroud)

但它应该

<MySerializeableClass>
    <AnyPath IsActive="true">C:\</AnyPath>
</MySerializeableClass>
Run Code Online (Sandbox Code Playgroud)

要求

我在这里读过,我可以通过创建一些(通常是通用的)类来实现这一点.这会产生大量额外的代码,特别是因为序列化结构中没有可识别的顺序(它是一个定义的标准).意味着使它变得通用会使它比上面添加的链接更复杂 - 这就是为什么我要避免这种情况以及为什么我来到这里.

所以一般来说我正在寻找使用属性的解决方案.但我也对其他可能的解决方案持开放态度.

编辑:

只是为了澄清,我已经知道创建类来解决这个问题的可能性.我提出这个问题是因为我想避免这个,我不知道如何.

c# serialization

2
推荐指数
1
解决办法
116
查看次数

rxjs条件嵌套可观察

我有以下代码可以正常工作:

const sourceObservable = ... // irrelevant
sourceObservable.subscribe(x => {
    doAnyway(x);
    if (x.Id) {             
        doSometing(x);
    } else {
        // id Not set, get default Id
        this.idService.getDefault().subscribe(id => {
            x.Id = id;                  
            doSometing(x);
        });
    }
});
Run Code Online (Sandbox Code Playgroud)

根据本文,嵌套订阅是要避免的。这就是为什么我尝试使用管道重构上述代码的原因。我尝试使用此方法实现if-else操作,其中使用过滤为每个选项创建一个可观察的分支。最后,它们应该合并以进行订阅。

const obsShared = sourceObservable.pipe(
tap(x => {
    doAnyway(x);
}),
share());

const obsIdNotSet = obsShared.pipe(
    filter(x => !x.kennzahlId),
    merge(x => idService.getDefault().subscribe(id => {
            x.Id = id;
        // doSomething(x) will nomore be executed here
        })));

// even though the true-part is empty …
Run Code Online (Sandbox Code Playgroud)

rxjs typescript angular

2
推荐指数
1
解决办法
452
查看次数

单元测试时 GetString(IStringLocalizer, String, Object[]) 返回 null

GetString(IStringLocalizer, String, Object[])我有一个测试类,它在某个时候使用扩展方法本地化字符串

除了测试之外,以下内容将有效

public class ClassToTest
{
    private readonly IStringLocalizer<SharedResource> _localizer;
    
    public AnalyticsLogic(IStringLocalizer<SharedResource> localizer)
    {
        _localizer = localizer;
    }
    
    public async Task<string> SomeMethod()
    {
        return _localizer.GetString("key", DateTime.Today));  // "My Date: 31.10.2018" - will return null when testing
    }       

    public async Task<string> SomeMethod2()
    {
        return _localizer.GetString("key");  // "My Date: {0:d}"
    }
}
Run Code Online (Sandbox Code Playgroud)

这就是我建立测试的方式:

public class ClassToTestTest
{
    private readonly ClassToTest _testee;
    private readonly Mock<IStringLocalizer<SharedResource>> _localizerMock = new Mock<IStringLocalizer<SharedResource>>();

    public ClassToTestTest()
    {
        _testee = new ClassToTest(_localizerMock.Object);

        _localizerMock.Setup(lm => lm["key"]).Returns(new LocalizedString("key", …
Run Code Online (Sandbox Code Playgroud)

c# unit-testing localization moq .net-core-2.1

1
推荐指数
1
解决办法
2521
查看次数