🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

2回答

365閲覧

C#でSwfitのPropertyWrapperのようなものを作りたい

2357

総合スコア3

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

1クリップ

投稿2021/02/07 14:35

編集2021/02/07 14:37

プロパティで実装することができると思うのですが、Swiftのように再利用する時に綺麗に描きたいです。

具体的なものとしては以下のSwiftコードをC#で実装したいです。
(これくらいならプロパティで十分ですが...)

コードがあれば嬉しいですが、機能の名前や、実装手順だけでも十分です。

よろしくお願いします。

swift

1@propertyWrapper 2struct Natural { 3 private var number = 0 4 var wrappedValue: Int { 5 get { return number } 6 set { number = newValue < 0 ? -newValue : newValue } 7 } 8} 9 10struct WrapperTest { 11 // こんな感じでシンプルに実装したい 12 @Natural var param: Int 13} 14 15var t = WrapperTest() 16t.param = -3 17t.param // <- 3 18 19t.param = 7 20t.param // <- 7 21 22t.param -= 10 23t.param // <- 3

調べたこと

アスペクト指向というものがヒットしたので、C#での実装を調べたところ、

  1. 参考: ProxyAttribute と ContextBoundObjec の利用
  2. 参考: RealProxy と MarshalByRefObject の利用

が見つかりました。
しかしこれらでは、他のクラスを継承できなくなることや、デバッグ向きであるためかパフォーマンスの低下が気になりました。
(あと、Swiftに比べて実装の量が多いことも)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2021/02/07 14:44

ソースジェネレーター。
guest

回答2

0

ベストアンサー

希望する実装かどうかは判りませんが、implicit operatorはどうでしょう。

C#

1 struct Natural 2 { 3 private int _Number; 4 5 public Natural(int value) 6 { 7 _Number = 0; 8 Value = value; 9 } 10 11 public int Value 12 { 13 get => _Number; 14 set => _Number = value < 0 ? -value : value; 15 } 16 17 public static implicit operator int(Natural n) => n.Value; 18 public static implicit operator Natural(int n) => new Natural(n); 19 } 20 21 struct WrapperTest 22 { 23 public Natural Param { get; set; } 24 } 25 26 class Program 27 { 28 static void Main(string[] args) 29 { 30 var t = new WrapperTest(); 31 t.Param = 7; 32 t.Param -= 10; 33 Console.WriteLine(t.Param); // <- 3 34 } 35 }

投稿2021/02/07 16:24

編集2021/02/07 16:27
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

2357

2021/02/08 03:48 編集

回答ありがとうございます。サンプルコードも助かります。 ソースジェネレーターが少し難しいと感じたのと、UnityはC#9.0をサポートしていない(C#の利用はUnityがメインなので)ことから、implicit operatorを使うことにしました。 演算子のオーバーライドではなく、型のキャストを定義できるとは知りませんでした。望んでいた実装とは少し異なりますが、これで代用しようと思います。 ありがとうございました。
guest

0

そのものズバリの機能はないので、やるとしたら多分一番簡単なのがソースジェネレーター。
この辺をちょっと流用すればできるんじゃないですか。

UseAutoNotifyGenerator.cs

投稿2021/02/07 16:11

編集2021/02/08 09:44
gentaro

総合スコア8947

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

2357

2021/02/08 03:40

回答ありがとうございます。 ソースジェネレータを利用すればできそうですが自分がC#に詳しくないのと、UnityでのC#利用が主なのでC#9.0がサポートされてない、という点から他の方法(implicit operator)で実装をしようと思います。 とても良い機能を教えていただきありがとうございました。
Zuishin

2021/02/08 03:52

ソースジェネレーターを C# 9.0 の新機能と紹介している記事が多いようですが、それは誤りです。C# 9.0 ではソースジェネレーターをサポートする言語機能を搭載しましたが、それが勘違いされているようです。 ソースジェネレーターを作成するには .NET Standard 2.0 であれば良く、使用するにはそれに対応したツール(つまり Visual Studio)があれば言語バージョンは関係ありません。
Zuishin

2021/02/08 03:53

また、Unity で C# 9.0 が使用できないというのも誤りです。Unity 界隈では昔からその手の謎の都市伝説があります。おそらくは、よく知らない人が書いた記事があふれているのが原因だと思います。
gentaro

2021/02/08 09:43

正確にはコンパイラの機能ですかね。 まぁ確かに、LangVersionを下げて使うことはできるなら表現として微妙か。 最近追加された新機能ってどのレベルで実現されてるのか考えて表現しないといけない、となると結構ややこしい話ではあるし、neueさんぐらいの「国内上位1割には入るであろうぐらいよく知ってる」人でも9.0の新機能って書いてたりはするけども…。 http://neue.cc/2020/12/15_597.html
gentaro

2021/02/08 09:52

あらら。 さすがに公式がコレはちょっと、うーむ…。
2357

2021/02/08 14:23

沢山のコメントありがとうございます。参考になります。 > ソースジェネレーターを作成するには .NET Standard 2.0 であれば良く、使用するにはそれに対応したツール(つまり Visual Studio)があれば言語バージョンは関係ありません。 なるほど、土日でSource Generatorも試したいと思います。 > Unity で C# 9.0 が使用できないというのも誤りです。 公式マニュアルに2020.2でC#8.0、LTSの2019.4ではC#7.3と書かれています。が、パッケージを導入するとできるみたいですね。知りませんでした。 https://docs.unity3d.com/2020.2/Documentation/Manual/CSharpCompiler.html
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問