主頁 > 移動端開發 > 你能在C#中創建類似JavaScript的物件嗎

你能在C#中創建類似JavaScript的物件嗎

2022-01-20 01:02:20 移動端開發

正如問題所述,我正在學習 C#,我想知道是否有可能擁有一個行為類似于 javascript 中的物件的全域可用物件?

意思是,它應該具有以下功能:

  1. 可以有一些具有默認值的公共屬性(最好是任何型別,但至少是字串)
  2. 可以匯入并在另一個模塊中全域可用
  3. 可以從另一個模塊訪問默認屬性(并在可能的情況下進行編輯,但不是必需的)
  4. 可以從另一個模塊設定新屬性

現在不幸的是,我真的不知道如何處理這項任務。我知道獲取和更新屬性需要定義“setters”和“getters”,這對于默認屬性很好,但是如何從另一個模塊動態創建新屬性?

是否可以為這個新屬性分配任意型別,而無需在 setter 中定義型別?我知道字典可以在 C# 中使用,但我仍然必須指定型別,而且我不知道如何使它們像全域類一樣運行,而不是必須將它們作為屬性傳遞,如果我想在 a 中使用我的字典不同的階級

作為一個簡化的示例,在 javascript 中,我們可以執行以下操作:

一些組件.js:

export default {
    prop1: "somevalue",
    prop2: null,
}

主檔案.js:

import myComponent from './somecomponent.js'

console.log(myComponent.prop1) // will output "somevalue"

myComponent.prop2 = True // will set the value of prop2 to True, from null

myComponent.newProp = {} // will create a new property that did not exist before, and assign an object to it 

現在,顯然 C# 將有不同的語法,但有可能有一些功能相似的東西嗎?

uj5u.com熱心網友回復:

你能在 C# 中創建類似 JavaScript 的物件嗎

你不能C# 和 JavaScript 是解決不同問題的不同語言,因此它們具有非常不同的型別系統和資料建模方法。

我制作了這張表,我希望它能指出 C# 和 JavaScript 型別系統之間的根本區別。特別是,我想提請您注意“屬性”是什么以及object含義方面的重要和根本差異。

C# JavaScript
產品型別 class 或者 struct object 實體
型別擴展范式 單繼承(型別繼承) 原型繼承(值繼承)
Object foo = /object foo = 是... 對記憶體中指定型別的 GC 堆分配的定義區域的任意參考(包括裝箱值)。 一個哈希表實體。
屬性是... 靜態定義的 getter/setter 方法,帶或不帶支持欄位。 具有鍵和任意值的哈希表條目string(包括標量、物件(其他哈希表)和函式)
class 是... 完全是靜態定義的型別。 建構式的簡寫。
型別標識 靜態定義。型別標識是嚴格主格的。 (通常)運行時定義。弱結構型別。正確使用建構式時型別標識是主格的(例如instanceof)。TypeScript 引入了嚴格的結構型別。
未定義的型別名稱 編譯器錯誤 運行時錯誤。
未定義的型別成員取消參考 編譯器錯誤 運行時錯誤。

我想知道是否有可能擁有一個行為類似于 javascript 中的物件的全域可用物件?

  • C# 沒有全域變數。
    • 在 C# 中,每個值和方法(函式)都必須存在于型別定義中(例如classstructinterface等)。
  • 我想最接近的等價物是通過public static欄位或屬性公開的值,但除非該值的型別是不可變的,否則由于執行緒安全和并發問題,您不應該從 C# 程式代碼中對其進行操作。JavaScript 沒有這個問題,因為 JavaScript 嚴格來說是單執行緒的,不允許并發訪問共享資源。

可以有一些具有默認值的公共屬性(最好是任何型別,但至少是字串)

class您可以在 C# 中使用具有默認值的屬性定義型別(即 a ),這些屬性可以被傳遞給類的建構式的顯式值覆寫。但是您仍然需要為這些屬性指定確切的型別。

如果您想要帶有命名條目的任意值集合,請改用 a Dictionary<K,V>作為Dictionary<K,V>強型別,您需要使用V: Object(ewwwww) 或定義一個自定義聯合struct,該聯合明確且詳盡地涵蓋所有可能的類似 JavaScript 的值 Func函式屬性的Action委托型別(如果您愿意的話)。

可以匯入并在另一個模塊中全域可用

  • C# 沒有“匯入”或“模塊”。
  • 在 C# 中,任何檔案中的任何publicinternal型別都.cs可以被.cs同一專案中的任何其他檔案使用。
    • 盡管internal型別不能被任何其他專案使用。
    • 并且您可能需要在using YourProject.ChildNamespace使用檔案中添加一個。

可以從另一個模塊訪問默認屬性(并在可能的情況下進行編輯,但不是必需的)

我不確定你在這里的意思,因為“默認屬性”在 JavaScript 和 C# 中根本不是一個東西。

我知道獲取和更新屬性需要定義“setters”和“getters”,這對于默認屬性很好,但是如何從另一個模塊動態創建新屬性?

同樣,“默認”在這兩種語言的背景關系中都不是有意義的術語。

And C# is a strictly-typed, statically-typed language: you cannot add or remove members to types at runtime (at least as far as this conversation is concerned).

Remember that a JavaScript object is really just a view of a hashtable, so it sounds to me like you just need a Dictionary<K,V>, or even ExpandoObject (as @Matthew suggests) as your post implies that you don't want to take advantage of type-safety at all.

Is it possible to assign arbitrary types to this new property, without defining the type in the setter?

Not at runtime. Only statically (i.e. in a defined class which is compiled once at design-time). Note that the dynamic type in C# is really just an ExpandoObject behind-the-scenes, which is just another kind of dictionary/map/hashtable, just like JavaScript's object type.

I know that dictionaries can be used in C#, but i still have to specify the type

While you do-indeed have-to specify the TValue type when using Dictionary<TKey,TValue>, it shouldn't be a blocking problem though, as you can use any of the following types for TValue:

  • Use Object? (or Object if you're targeting .NET Framework 4.x) for TValue, but this is not type-safe and introduces too many awkward consequences for me to seriously consider.
  • Using dynamic (for TValue) has the same issues as using Object.
  • Using dynamic (instead of a Dictionary<TKey,TValue> entirely) is, just, no.
  • Using a type-union (tip: use OneOf<>) to define the exhaustive set of valid types. This can also be recursive.

Below is my first personal interpretation of your JavaScript example, using only statically defined and immutable types (as thread-safety is largely impossible without immutable data):

MyValues.cs:

using System;

namespace MyProject
{
    public class MyValues
    {
        public String   Prop1 { get; init; } = "somevalue";
        public Boolean? Prop2 { get; init; } = null;
    }

    public class MyDerived : MyValues
    {
        public SomeOtherType NewProp { get; init; }
    }
}

Program.cs:

using System;

namespace MyProject
{
    public static class Program
    {
        public static void Main()
        {
            MyValues myValues1 = new MyValues()
            {
                Prop2 = false
            };

            Console.WriteLine( "Prop1: \"{0}\".", myValues1.Prop1 ); // "Prop1: "somevalue"."
            Console.WriteLine( "Prop2: {0}.", myValues1.Prop2 ); // "Prop2: True."

            //

            MyDerived myValues2 = new MyDerived()
            {
                Prop1 = "newStringValue",
                Prop2 = true,
                NewProp = new SomeOtherType()
            };
        
            Console.WriteLine( "Prop1: \"{0}\".", myValues2.Prop1 ); // "Prop1: "newStringValue"."
            Console.WriteLine( "Prop2: {0}.", myValues2.Prop2 ); // "Prop2: True."
        }
    }
}

Note that:

  • The Prop1 and Prop2 properties in class MyValues above wrap corresponding hidden private instance fields generated by the compiler. Prior to C# 3.0 every property declaration had to have an explicit backing field.
  • MyDerived inherits from MyValues (so it gains Prop1 and Prop2 implicitly), however this is just for demonstration purposes: in C# you should not use inheritance as a poor substitute for mixins and member-sharing. Only use inheritance when you're meaningfully implementing an "is" relationship and not a "has" relationship.
    • Unfortunately even C# 10.0 (released in November 2021) still doesn't have true mixins and similarly its support for object-composition is very weak (let alone any kind of true algebratic types (ADTs)). While C# 11 will likely have simpler ADTs I'm not expecting support for true unions, products, and intersection-types until after C# 12 or even 13.
  • Since C# 9.0, properties can be declared with init-setters, which indicates that the property can only be set inside a constructor or inside an object-initializer. My example is using init-setters for simplicity, but they should be avoided in production-code except for truly optional values and never for any required values because the constructor cannot provide guarantees about object-initializers, as object-initializers run after the constructor has returned.

Below is my second personal interpretation of your JavaScript example, using dictionary collection-types with a OneOf<...> union to add type-safety.

警告:global using在使用 C# 10.0 時遇到了問題,尤其是在使用自參考型別別名時。雖然我下面的代碼無法編譯,但仍然可以將型別別名轉換為struct實作相同效果的包裝器。

實用程式.cs:

namespace MyProject
{
    // "Global Usings" imbue a type-alias with project-wide visibility, but requires C# 10.0.
    // Also, this doesn't compile for me, but *in-principle* the code below is still correct.

    global using ValueDict = Dictionary<String,PossibleValueTypes>;
    global using PossibleValueTypes = OneOf<ValueDict,String,Int32,Boolean,Decimal,Null>;

    global using ImmutablePossibleValueTypes = OneOf<ImmutableValueDict,String,Int32,Boolean,Decimal>;
    global using ImmutableValueDict = ImmutableDictionary<String,PossibleValueTypes,Null>;

    // This empty struct is used as a type-tag to allow `null` (which is a reference-value in C#/.NET) to be used _almost_ like a type (just like in TypeScript, where `null` is both a type and a value).
    // But as C# is not JavaScript you really shouldn't ever do this (as C# has (almost) first-class support for nullable reference types already).
    public struct Null {}
}

MyValues.cs:

using System;
using OneOf;

namespace MyProject
{
    public static class MyValues
    {
        public static ImmutableValueDict Values { get; } = new ImmutableValueDict()
        {
            { "Prop1", "someValue" },
            { "Prop2", new Null() },
        };
    }
}

程式.cs:

using System;

namespace MyProject
{
    public static class Program
    {
        public static void Main()
        {
            ImmutableValueDict myValues1 = MyValues.Values;

            Console.WriteLine( "Prop1: \"{0}\".", myValues1.Prop1 ); // "Prop1: "somevalue"."
            Console.WriteLine( "Prop2: {0}.", myValues1.Prop2 ); // "Prop2: MyProject.Null"

            //

            ImmutableValueDict myValues2 = new ImmutableValueDict( myValues1 ) // <-- This constructor overload will copy the entries in `myValues1` into `myValues2` - though as `myValues2`'s collection-initializer overwrites both Prop1 and Prop2 it's kinda moot.
            {
                { "Prop1", "newStringValue" ),
                { "Prop2", true ),
                { "NewProp", new ImmutableValueDict() ) // Nested dicts!
            };
        
            Console.WriteLine( "Prop1: \"{0}\".", myValues2.Prop1 ); // "Prop1: "newStringValue"."
            Console.WriteLine( "Prop2: {0}.", myValues2.Prop2 ); // "Prop2: True."
        }
    }
}

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/415669.html

標籤:

上一篇:如何讓圖片框不相互重疊?

下一篇:為同一注冊表項獲取不同值的原因可能是什么?

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【從零開始擼一個App】Dagger2

    Dagger2是一個IOC框架,一般用于Android平臺,第一次接觸的朋友,一定會被搞得暈頭轉向。它延續了Java平臺Spring框架代碼碎片化,注解滿天飛的傳統。嘗試將各處代碼片段串聯起來,理清思緒,真不是件容易的事。更不用說還有各版本細微的差別。 與Spring不同的是,Spring是通過反射 ......

    uj5u.com 2020-09-10 06:57:59 more
  • Flutter Weekly Issue 66

    新聞 Flutter 季度調研結果分享 教程 Flutter+FaaS一體化任務編排的思考與設計 詳解Dart中如何通過注解生成代碼 GitHub 用對了嗎?Flutter 團隊分享如何管理大型開源專案 插件 flutter-bubble-tab-indicator A Flutter librar ......

    uj5u.com 2020-09-10 06:58:52 more
  • Proguard 常用規則

    介紹 Proguard 入口,如何查看輸出,如何使用 keep 設定入口以及使用實體,如何配置壓縮,混淆,校驗等規則。

    ......

    uj5u.com 2020-09-10 06:59:00 more
  • Android 開發技術周報 Issue#292

    新聞 Android即將獲得類AirDrop功能:可向附近設備快速分享檔案 谷歌為安卓檔案管理應用引入可安全隱藏資料的Safe Folder功能 Android TV新主界面將顯示電影、電視節目和應用推薦內容 泄露的Android檔案暗示了傳說中的谷歌Pixel 5a與折疊屏新機 谷歌發布Andro ......

    uj5u.com 2020-09-10 07:00:37 more
  • AutoFitTextureView Error inflating class

    報錯: Binary XML file line #0: Binary XML file line #0: Error inflating class xxx.AutoFitTextureView 解決: <com.example.testy2.AutoFitTextureView android: ......

    uj5u.com 2020-09-10 07:00:41 more
  • 根據Uri,Cursor沒有獲取到對應的屬性

    Android: 背景:呼叫攝像頭,拍攝視頻,指定保存的地址,但是回傳的Cursor檔案,只有名稱和大小的屬性,沒有其他諸如時長,連ID屬性都沒有 使用 cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATIO ......

    uj5u.com 2020-09-10 07:00:44 more
  • Android連載29-持久化技術

    一、持久化技術 我們平時所使用的APP產生的資料,在記憶體中都是瞬時的,會隨著斷電、關機等丟失資料,因此android系統采用了持久化技術,用于存盤這些“瞬時”資料 持久化技術包括:檔案存盤、SharedPreference存盤以及資料庫存盤,還有更復雜的SD卡記憶體儲。 二、檔案存盤 最基本存盤方式, ......

    uj5u.com 2020-09-10 07:00:47 more
  • Android Camera2Video整合到自己專案里

    背景: Android專案里呼叫攝像頭拍攝視頻,原本使用的 MediaStore.ACTION_VIDEO_CAPTURE, 后來因專案需要,改成了camera2 1.Camera2Video 官方demo有點問題,下載后,不能直接整合到專案 問題1.多次拍攝視頻崩潰 問題2.雙擊record按鈕, ......

    uj5u.com 2020-09-10 07:00:50 more
  • Android 開發技術周報 Issue#293

    新聞 谷歌為Android TV開發者提供多種新功能 Android 11將自動填表功能整合到鍵盤輸入建議中 谷歌宣布Android Auto即將支持更多的導航和數字停車應用 谷歌Pixel 5只有XL版本 搭載驍龍765G且將比Pixel 4更便宜 [圖]Wear OS將迎來重磅更新:應用啟動時間 ......

    uj5u.com 2020-09-10 07:01:38 more
  • 海豚星空掃碼投屏 Android 接收端 SDK 集成 六步驟

    掃碼投屏,開放網路,獨占設備,不需要額外下載軟體,微信掃碼,發現設備。支持標準DLNA協議,支持倍速播放。視頻,音頻,圖片投屏。好點意思。還支持自定義基于 DLNA 擴展的操作動作。好像要收費,沒體驗。 這里簡單記錄一下集成程序。 一 跟目錄的build.gradle添加私有mevan倉庫 mave ......

    uj5u.com 2020-09-10 07:01:43 more
最新发布
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:40:31 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:40:11 more
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:39:36 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:39:13 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:16:23 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:16:15 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:15:46 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:14:53 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:14:08 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:08:34 more