iPX社員によるブログ

iPX社員が"社の動向"から"自身の知見や趣味"、"セミナーなどのおすすめ情報"に至るまで幅広い話題を投下していくブログ。社の雰囲気を感じ取っていただけたら幸いです。

開発言語が異なるプロジェクトを掛け持ちした時って

自己紹介

はじめまして、今回の記事担当の須山と申します。
現在 私は、とあるお客様の所でWindchillやTeamcenter等 PDMのアドオン開発を行っています。

substringの第2引数って文字列長さ?終了文字のインデックス?

最初は業務に向いた話にしようか、業務以外(趣味等)に向いた話にしようか…
と考えましたが、今回は業務に向いた話にしたいと思います。

世の中にはいろいろなプログラミング言語があります。
こちらは、少し前の記事になりますが…
news.mynavi.jp

私が自分の業務でここ数年で使用した主な言語は
JavaC#C++…等があります。
(他にも触ったことがあるものもありますが、最近はこんな感じです。)

C#Javaとかはぱっと見似ているような気がしますが
同じように(似たように)書いたらちょっと思ったことと違ったりする場合もあります。

例えば、C#Javaで文字列の一部を取得したい場合に substringを使用しますが

C#
ExampleCSharp1.cs
using System;

namespace ExampleCSharp1
{
    class Program
    {
        static void Main(string[] args)
        {
            string var0 = "iPX co.,ltd.";
            string var1 = var0.Substring(4, 8);

            Console.WriteLine(var1);
        }
    }
}

Java
ExampleJava1.java
public class ExampleJava1 {
    public static void main(String[] args) {
        String var0 = "iPX co.,ltd.";
        String var1 = var0.substring(4, 8);

        System.out.println(var1);
    }
}

どちらも文字列は"iPX co.,ltd."、substringの引数は "4"と"8"ですが、実行すると以下のようになります。
f:id:ipx-writer:20150515223926p:plainf:id:ipx-writer:20150515223956p:plain

同じような処理をしたいメソッドでも、C#Javaで引数の意味が違うためこうなります。
(この場合 C#では開始文字インデックスと文字列長さ、Javaでは開始文字インデックスと終了文字インデックス)

他にも、文字列の比較にequalsと==を使用した場合に

C#
ExampleCSharp2.cs
using System;

namespace ExampleCSharp2
{
    class Program
    {
        static void Main(string args)
        {
            char
var0 = { 'i', 'P', 'X' };
            string var1 = "iPX";
            string var2 = new string(var0);

            if (var1.Equals(var2))
            {
                Console.WriteLine("Equals is TRUE");
            }
            else
            {
                Console.WriteLine("Equals is FALSE");
            }
            if (var1 == var2)
            {
                Console.WriteLine("== is TRUE");
            }
            else
            {
                Console.WriteLine("== is FALSE");
            }
        }
    }
}

Java
ExampleJava2.java
public class ExampleJava2 {
    public static void main(String args) {
        char
var0 = { 'i', 'P', 'X' };
        String var1 = "iPX";
        String var2 = new String(var0);

        if (var1.equals(var2)) {
            System.out.println("Equals is TRUE");
        } else {
            System.out.println("Equals is FALSE");
        }
        if (var1 == var2) {
            System.out.println("== is TRUE");
        } else {
            System.out.println("== is FALSE");
        }
    }
}

(↑恐らく実際にこのような記述をすることは無いと思いますが、今回は例のためです。)
実行すると以下のようになります。
f:id:ipx-writer:20150515224142p:plainf:id:ipx-writer:20150515224155p:plain

==の結果が異なります。

まとめ

同時期に開発言語が異なるプロジェクトを掛け持ちした時に
「あれ、この場合ってどうだっけ?」と思ったことがあったのでこれをお題に書いてみました。

(ちなみに、最初の例に文字列のsubstringを挙げたのは
たまに第2引数が、文字列長さ or 終了文字インデックス のどっちだっけ?と思うことがあったので例としました。)