C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: Currency 構造体を作りたいのだが


(過去ログ 75 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■43697 / inTopicNo.1)  Currency 構造体を作りたいのだが
  
□投稿者/ みきぬ (658回)-(2009/11/16(Mon) 17:24:41)

分類:[C#] 

分類は一応 C# ですが、VB でも大丈夫です。

.NET で、Currency 構造体がほしいなと思い立ちました。
正確には、小数第3〜4位くらいまで扱える、遅くない数値型がほしいなと思って調べたところ、
旧VB の Currency 型がほぼそのまんまであることがわかりました。
内部的には、10000倍して long で持つ感じでよさそうです。

さて、書いてる途中でふと思いました。これって、使うときには

Currency c = new Currency(123.4567);

って書かないとだめなんですかね?

Currency c = 123.4567;

↑こういう風に書けないと、せっかく作ってもちょっとしょんぼり感があるのですが…。
こういう書き方ができるのは、組み込みの型にだけ許された特権なのでしょうか?
引用返信 編集キー/
■43698 / inTopicNo.2)  Re[1]: Currency 構造体を作りたいのだが
□投稿者/ επιστημη (2276回)-(2009/11/16(Mon) 17:38:39)
επιστημη さんの Web サイト
> さて、書いてる途中でふと思いました。これって、使うときには
> Currency c = new Currency(123.4567);
> って書かないとだめなんですかね?
> 
> Currency c = 123.4567;
> 
> ↑こういう風に書けないと、せっかく作ってもちょっとしょんぼり感があるのですが…。

public class Currency {
  private double value;
  public Currency(double v) { value = v; }
  public double Get() { return value; }

  // キャストなしにdoubleからCurrencyを召喚する魔法
  public static implicit operator Currency(double v)
    { return new Currency(v); } // かーまぼーこー!
}

public class Program {
  public static void Main() {
    Currency c = 123.456; // Currency召喚!
    System.Console.WriteLine(c.Get());
  }
}

引用返信 編集キー/
■43700 / inTopicNo.3)  Re[2]: Currency 構造体を作りたいのだが
□投稿者/ みきぬ (659回)-(2009/11/16(Mon) 17:58:53)
なるほど、変換演算子を定義できるんだー。
http://msdn.microsoft.com/ja-jp/library/09479473.aspx

幸せになれそうです。ありがとうございました。

# しかし真面目に作ろうとすると、かなり骨が折れますな、これ
解決済み
引用返信 編集キー/
■43701 / inTopicNo.4)  Re[3]: Currency 構造体を作りたいのだが
□投稿者/ 魔界の仮面弁士 (1391回)-(2009/11/16(Mon) 18:37:20)
No43700 (みきぬ さん) に返信
>>> 小数第3〜4位くらいまで扱える、遅くない数値型がほしいなと思って
> # しかし真面目に作ろうとすると、かなり骨が折れますな、これ

そもそも、System.Decimal の処理速度面でどの程度の不足を感じていて、
それをどの程度にまで高速化したいのかを明らかにしておかないと、
「作ったは良いけど、かえって低速になってしまった」ということもありそうです。


>>> 旧VB の Currency 型がほぼそのまんまであることがわかりました。
>>> 内部的には、10000倍して long で持つ感じでよさそうです。

そのままで良いのであれば、OLEAUT32.DLL の VarCyFromI4 や VarCyFromStr API を使うと、
VB で言うところの Currency を生成する事ができます。

また、VarCyAdd/VarCyMul/VarCyFix/VarCySub/VarCyCmp 等を用いて
それを演算する事もできます。……あまり意味はありませんが。

解決済み
引用返信 編集キー/
■43711 / inTopicNo.5)  Re[4]: Currency 構造体を作りたいのだが
□投稿者/ みきぬ (660回)-(2009/11/17(Tue) 10:34:09)
# 返信書いてたら Service Unavailable で消えた orz

No43701 (魔界の仮面弁士 さん) に返信
> そもそも、System.Decimal の処理速度面でどの程度の不足を感じていて、
> それをどの程度にまで高速化したいのかを明らかにしておかないと、
> 「作ったは良いけど、かえって低速になってしまった」ということもありそうです。
>
「decimal は遅い」というのは、知識レベル(MSDNとか、Blogとか)でありました。
どれだけ遅いのかは、比較対象になるものを持っていない(long も double も違うと思った)ので、今回作ろうと思い立ちました。

実際には、DB 上は decimal のまま管理するだろうとか、全体的に見るとそれほどの効果がないことは十分考えられまが、試さずに捨てるよりは、試してから捨てたいなあと思いました。

# このあたりを一言で書くと「作ってから考えよう」ということですが


> そのままで良いのであれば、OLEAUT32.DLL の VarCyFromI4 や VarCyFromStr API を使うと、
> VB で言うところの Currency を生成する事ができます。
>

実使用を考えると、decimal から楽に置き換えできるとか、Currency を使っていることをあまり意識させたくないとか、何か問題がわかったときに手を入れられるとかいった点もポイントになると思うので、構造体として1から作るのがいいかなと思いました。
# 手頃なサンプルを探したけど、見つからなかったってのもある

ただ、仕事の片手間でやるレベルを超えそうなので、このまま続行するかはちょっと考えたいと思います。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -