RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / user-231839

CSharpUser's questions

Martin Hope
CSharpUser
Asked: 2020-12-26 07:15:10 +0000 UTC

CLR中UpCast“ing\DownCast”ing的操作/存储语义

  • 3

让我们从理论开始。
假设我们有以下课程:

class A{}
class B : A{}
class C : B{}

接下来,我们做UpCast:

A a1 = new C();  

以下陈述是否成立:对象a1是类型 C 的对象,并且它的基类是类型A(即在层次结构中向上)!?

远离结帐,想象一下将以下内容添加到您的代码中:

class A
{
    public virtual void Method()
    {
        Console.WriteLine("Method A invoked");
    }
}
class B : A
{
    public new virtual void Method()
    {
        Console.WriteLine("Method B invoked");
    }
}
class C : B
{
    public override void Method()
    {
        Console.WriteLine("Method C invoked");
    }
}

会显示什么?
首先,这里似乎一切都很明显,输出将是:

Method A invoked
Method A invoked
Method С invoked
Method C invoked   

但实际上,我们得到: Method A invoked Method A invoked Method A invoked Method C invoked

根据这个逻辑,事实证明我之前的说法是不正确的,这意味着C的基类仍然是B?


现在让我们继续讨论问题的另一部分。
例如,我们有这样的代码:

  class Program
    {
        static void Main(string[] args)
        {
            //объект типа класса А
            A a = new A();
            //объект типа класса B
            B b = new B();
            //UpCast, который равен объекту "b"
            A a1 = b;
            //UpCast как отдельный объект
            A a2 = new B();
            //DownCast, который равен объекту "а1"
            B b1 = (B)a1;

            B b2 = a as B; // вернет Null, т.к. DownCast
            //без предварительного UpCast не возможен

            // B b2 = new A(); - невозможно из за безопасности типов

            //сравниваем b с а1,видим что типы идентичны.
            Console.WriteLine(b.GetType() == a1.GetType());
            //сравниваем а2 с а1,видим что типы идентичны.
            Console.WriteLine(a2.GetType() == a1.GetType());
            //сравниваем b1 и а1,видим что типы идентичны
            Console.WriteLine(b1.GetType() == a1.GetType());

            //Проверяем сами обьекты,вернет True
            Console.WriteLine(a1.Equals(b));
            //вернет False,но реализация этих объектов идентична
            Console.WriteLine(a2.Equals(a1));
            //Вернет True
            Console.WriteLine(b1.Equals(a1));

            Console.ReadKey();
        }
    }
    class A
    {
    }
    class B : A
    {
    }  

近似的 IL 代码(不是所有的都适合)

那么幕后发生了什么?
与UpCast "e \ DownCast"一样,两个相同的对象(更准确地说,指向同一对象的两个引用)具有不同的实现(是的,是的 - 这就是多态性)。这是如何实现的(即 CLR 如何实现此行为模型)以及 Yudo 的所有这些奇迹在 CLR 本身中是什么样子的?在CLR中,类型之间的“继承”是什么样的?

c#
  • 1 个回答
  • 10 Views
Martin Hope
CSharpUser
Asked: 2020-12-25 07:09:21 +0000 UTC

在 CLR 中工作/存储静态的语义

  • 5

众所周知,静态不附加到对象(实例),而是存储在对象类型(!)中,因此,此静态(以字段/方法等形式)将存在于单个实例中对于该类型的所有已创建对象。

换句话说,所有创建的 !static 类对象都将引用这些静态方法/字段的单个版本。

在这种背景下,问题出现了,使用 statics的最佳方式是什么,因为带有修饰符static 的对象不受垃圾收集的影响,因为。存储在对象类型中(它又与应用程序域相关联,并且将存在直到应用程序生命周期结束)。

您是否应该避免使用处理大量数据的静态集合/数组(或者值得,但您需要手动“清理”它们)?

使用静态有什么不好的形式?

或者是否可以使用与实例变体相同数量的静态变量?

c#
  • 1 个回答
  • 10 Views
Martin Hope
CSharpUser
Asked: 2020-12-23 06:58:09 +0000 UTC

This 关键字及其在 Class\User 结构中的使用

  • 6

我注意到自定义结构和类中“ this ”关键字的语义完全不同。
例如,在结构中我们可以这样做:

struct MyStruct
{
    int x,y;

    void Reset()
    {
        this = new MyStruct(); // удаляем предыдущую структуру и создаем новую О_О
    }
}  

我想看看This关键字、结构和类之间的全部区别,并找出幕后发生的事情。

c#
  • 2 个回答
  • 10 Views
Martin Hope
CSharpUser
Asked: 2020-12-23 05:09:55 +0000 UTC

当一个 ValueType 被销毁时以及 GC 操作与 ValueType 的语义

  • 4

有传言说ValueType被GC删除了(即GC释放了ReferenceType和ValueType)。
但事实上,并非如此。例如我们有代码:

class A {}
class B
{
    void TestMethod()
    {
        A a = new A();
        int x = 100;
    }
}  

在TestMethod( ) 方法的上下文(范围)中,创建类型A的对象 (ReferenceType)以及变量X (ValueType)。

方法完成后,变量X被销毁,类型A的对象失去对该对象的引用,并成为从GC中移除的竞争者。

换句话说,ValueType只要被执行就存在于上下文中,相应的Stack,通过Pop()方法的类型,会自己从内存中移除这个数据,而GC不参与this ,因此ValueType工作更快(尽管这完全取决于任务)。

问题是,它总是这样工作吗?(我读过各种文章,有时他们写道,只有当堆栈堵塞时才会发生这种情况,即达到满)

当堆栈几乎已满并且其中的所有数据(例如,都是对堆上的对象的引用)时,CLR会做什么?如何以及何时删除用户结构?CLR究竟是如何决定是从堆栈中删除数据还是让它存在第 N 次!??

.net
  • 1 个回答
  • 10 Views
Martin Hope
CSharpUser
Asked: 2020-12-23 02:56:50 +0000 UTC

释放堆栈中的内存

  • 4

大家都知道 Stack 就是分配给每个线程的一块内存,大小为1MB ,它存储对ReferenceType的引用(ObjRef)、用户结构、原始数据和方法的局部变量。

现在的问题是:当 Stack 完全填满时, CLR会做什么,因此,基本上没有什么可删除的。也就是说,Stack 已满?

CLR 可以将其边界从 1MB 扩展到 2MB 吗?(或者这是不可能的,所以我们只会得到一个异常,通知我们堆栈溢出)。

另一个问题:在不安全代码的上下文中,unamanged 内存也分配了 1MB,或者可以分配自定义大小?

c#
  • 1 个回答
  • 10 Views
Martin Hope
CSharpUser
Asked: 2020-12-23 01:03:34 +0000 UTC

用户结构作为程序的入口点

  • 11

用户结构可以作为程序的主要入口吗?

这个问题是修辞性的,因为就 IDE 向我展示的而言,这是可能的(也就是说,创建 Main 方法就足够了,一切都会顺利进行)。

但是另一个问题由此而来——它充满了什么,它被认为是不礼貌的!?

c#
  • 1 个回答
  • 10 Views
Martin Hope
CSharpUser
Asked: 2020-12-22 04:26:50 +0000 UTC

通用类型和隐式/显式类型指示

  • 1

例如,有两个方法看起来很普通,但问题是它们是否可以这样调用:

// Обобщенный тип с неявным указанием типа, и соответственно 
// так писать можно(никаких синтаксическим ошибок в коде нет)
void Method(T arg);  

等等

void Method<T>(T arg); // Обобщенный тип с явным указанием типа

也就是说,事实上,这两种方法是相同的(因此,是Generics,还是完全相同,在第一种情况下,我们不能说该方法是通用的(尽管它有一个参数化参数)?

UPD
我忘了澄清一点,即上述方法在通用接口或类中,即

interface IFly<T>
{
    void Method<T>(T arg); //так
    void Method(T arg); // или так
}
c#
  • 2 个回答
  • 10 Views
Martin Hope
CSharpUser
Asked: 2020-12-22 03:25:07 +0000 UTC

C#/JIT 编译器上下文中的内联术语

  • 6

下午好。
我遇到了这样一个问题,即我想在C#的上下文中分别清楚地理解诸如内联方法之类的术语的定义(以便“内联方法”之类的问题消失)。

问题的第二部分,为什么JIT编译器优于内联方法?

c#
  • 1 个回答
  • 10 Views

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5