সদস্য '<স্মৃতি>' উদাহরণের উল্লেখ সহ অ্যাক্সেস করা যাবে না


195

আমি সি # তে উঠছি এবং আমার এই সমস্যাটি হচ্ছে:

namespace MyDataLayer
{
    namespace Section1
    {
        public class MyClass
        {
            public class MyItem
            {
                public static string Property1{ get; set; }
            }
            public static MyItem GetItem()
            {
                MyItem theItem = new MyItem();
                theItem.Property1 = "MyValue";
                return theItem;
            }
        }
     }
 }

ইউজারকন্ট্রোলটিতে আমার এই কোডটি রয়েছে:

using MyDataLayer.Section1;

public class MyClass
{
    protected void MyMethod
    {
        MyClass.MyItem oItem = new MyClass.MyItem();
        oItem = MyClass.GetItem();
        someLiteral.Text = oItem.Property1;
    }
}

আমি অ্যাক্সেসে যাওয়ার সময় বাদে সবকিছু ঠিকঠাক কাজ করে Property1। Intellisense শুধুমাত্র দেয় আমাকে " Equals, GetHashCode, GetType, এবং ToString" বিকল্পগুলি হিসাবে। আমি যখন মাউসটি oItem.Property1আনি, তখন ভিজ্যুয়াল স্টুডিও আমাকে এই ব্যাখ্যা দেয়:

MemberMyDataLayer.Section1.MyClass.MyItem.Property1.getcannot be accessed with an instance reference, qualify it with a type name instead

আমি এর অর্থ সম্পর্কে নিশ্চিত নই, আমি কিছু গুগলিং করেছি তবে তা বের করতে সক্ষম হয়েছি।

উত্তর:


283

সি # তে, ভিবি.এনইটি এবং জাভা থেকে ভিন্ন, আপনি staticউদাহরণ বাক্য গঠন সহ সদস্যদের অ্যাক্সেস করতে পারবেন না । আপনাকে যা করতে হবে:

MyClass.MyItem.Property1

সেই সম্পত্তিটি উল্লেখ করতে বা staticপরিবর্তকটি Property1(যা আপনি সম্ভবত যা করতে চান) থেকে সরিয়ে ফেলতে পারেন। কী staticতা সম্পর্কে ধারণাগত ধারণার জন্য, আমার অন্যান্য উত্তরটি দেখুন


45

আপনি কেবল ধরণের নাম ব্যবহার করে স্থির সদস্যদের অ্যাক্সেস করতে পারেন।

অতএব, আপনি হয় লিখতে হবে,

MyClass.MyItem.Property1

অথবা (সম্ভবত এটি আপনার প্রয়োজন।) এর সংজ্ঞা থেকে কীওয়ার্ডটি Property1সরিয়ে একটি উদাহরণ সম্পত্তি তৈরি করুন static

স্ট্যাটিক বৈশিষ্ট্যগুলি তাদের শ্রেণীর সমস্ত দৃষ্টান্তের মধ্যে ভাগ করা হয়, যাতে তাদের কেবল একটি মান থাকে। এটি এখন যেভাবে সংজ্ঞায়িত হয়েছে, আপনার মাই আইটেম শ্রেণির কোনও উদাহরণ তৈরি করার কোনও মানে নেই।


এটি "বা (সম্ভবত এটি আপনার প্রয়োজন) সাফল্যের চাবিকাঠি !! ধন্যবাদ
টিম 687

29

আমার একই সমস্যা ছিল - যদিও কয়েক বছর পরে, কেউ কেউ কয়েকটি পয়েন্টারকে সহায়ক বলে মনে করতে পারে:

কৃতজ্ঞভাবে 'স্ট্যাটিক' ব্যবহার করবেন না!

রান-টাইম এবং সংকলন সময় শব্দার্থবিজ্ঞান (আচরণ) এবং বাক্য গঠন উভয়ের ক্ষেত্রে 'স্ট্যাটিক' কী বোঝায় তা বুঝুন।

  • একটি স্থিতিশীল সত্তা
    এটির প্রথম ব্যবহারের কিছুক্ষণ আগে স্বয়ংক্রিয়ভাবে নির্মিত হবে।

  • একটি স্থিতিশীল সত্তার একটি স্টোরেজ অবস্থান বরাদ্দ থাকে এবং
    যারা সেই সত্তাকে অ্যাক্সেস করে তাদের দ্বারা ভাগ করা হয়।

  • একটি স্ট্যাটিক সত্তা কেবলমাত্র তার প্রকারের নাম দিয়েই অ্যাক্সেস করা যায়
    , সেই ধরণের উদাহরণের মাধ্যমে নয় ।

  • একটি স্ট্যাটিক পদ্ধতিতে একটি অন্তর্নিহিত 'এই' যুক্তি থাকে না, যেমন একটি উদাহরণ পদ্ধতিও। (এবং তাই একটি স্থির পদ্ধতিতে কম প্রয়োগের
    ওভারহেড থাকে - সেগুলি ব্যবহারের একটি কারণ))

  • স্ট্যাটিক সত্তাগুলি ব্যবহার করার সময় থ্রেড সুরক্ষা সম্পর্কে চিন্তা করুন।

এমএসডিএন-তে স্ট্যাটিক সম্পর্কিত কিছু বিবরণ:


4

পুঙ্খানুপুঙ্খভাবে বর্ণিত হিসাবে এক্ষেত্রে স্ট্যাটিক ব্যবহার করার দরকার নেই। GetItem()নীচে উভয়ের উদাহরণ হিসাবে আপনি কোনও পদ্ধতি ছাড়াই নিজের সম্পত্তিটি সূচনা করতে পারেন :

namespace MyNamespace
{
    using System;

    public class MyType
    {
        public string MyProperty { get; set; } = new string();
        public static string MyStatic { get; set; } = "I'm static";
    }
}

গ্রাসকারী:

using MyType;

public class Somewhere 
{
    public void Consuming(){

        // through instance of your type
        var myObject = new MyType(); 
        var alpha = myObject.MyProperty;

        // through your type 
        var beta = MyType.MyStatic;
    }
}       

3

একটি উদাহরণ রেফারেন্স সহ অ্যাক্সেস করা যাবে না

এর অর্থ আপনি একটি স্ট্যাটিক পদ্ধতিতে কল করছেন এবং এটি একটি উদাহরণ দিয়ে যাচ্ছেন। স্ট্যাটিক অপসারণের সহজ সমাধান হ'ল:

পাবলিক স্ট্যাটিক অকার্যকর এক্সপোর্টটওএক্সসেল (আইনিমেবল ডেটা, স্ট্রিং শিটনাম) {


2

আমি জানি এটি একটি পুরানো থ্রেড, তবে আমার সমস্যাটি কী তা বোঝার জন্য আমি মাত্র 3 ঘন্টা ব্যয় করেছি। আমি সাধারণত জানি যে এই ত্রুটিটির অর্থ কী, তবে আপনি আরও সূক্ষ্ম উপায়ে এটি চালাতে পারেন। আমার ইস্যুটি ছিল আমার ক্লায়েন্ট শ্রেণি (যিনি একটি উদাহরণ ক্লাস থেকে স্ট্যাটিক পদ্ধতি ডাকছেন) এর একটি পৃথক ধরণের সম্পত্তি ছিল তবে স্থির পদ্ধতি হিসাবে একই নামকরণ করা হয়েছিল। সংকলক দ্বারা প্রতিবেদন করা ত্রুটিটি এখানে প্রতিবেদনের মতোই ছিল তবে সমস্যাটি মূলত নাম সংঘর্ষের ছিল।

অন্য কেউ এই ত্রুটিটি পেয়েছে এবং উপরেরগুলির কেউই সহায়তা করে না, আপনার স্থান ক্লাসটি পুরোপুরি নেমস্পেসের সাথে যোগ্যতার চেষ্টা করুন। .. () সুতরাং সংকলকটি আপনার সঠিক নামটি বোঝাতে পারে।


আমি এটি সহায়ক বলে মনে করেছি। আমার একটি নামের সংঘর্ষ ছিল এবং এটি এটি জানত না। আমার পদ্ধতি কল করার আগেই আমি নেমস্পেস যুক্ত করার সাথে সাথেই সমস্যাটি সমাধান হয়ে গেছে।
সর্বোচ্চ

1

আপনার কোডে এমন কোনও নামস্থান রয়েছে কিনা তা যাচাই করুন যা ডান দিকের অংশটি আপনার স্থির শ্রেণীর নামের সাথে মেলে।

স্ট্যাটিক বার ক্লাস দেওয়া হয়েছে, নেমস্পেস ফু এর উপর সংজ্ঞায়িত করা হয়েছে , কোনও পদ্ধতি ঝাঁপ দাও বা সম্পত্তি প্রয়োগ করে , আপনি সম্ভবত সংকলক ত্রুটি পেয়ে যাচ্ছেন কারণ বারে আরও একটি নেমস্পেস শেষ হচ্ছে chan । হ্যাঁ, ফিশি স্টাফ ;-)

যদি তা হয় তবে এর অর্থ আপনার ব্যবহার বারটি ব্যবহার করা; এবং একটি বার.জম্প () কল, অতএব নিম্নলিখিত সমাধানগুলির মধ্যে একটিতে আপনার প্রয়োজন মাপসই করা উচিত:

  • স্টেটিক ক্লাসের নামটি পুরোপুরি যোগ্যতা অনুসারে নেমস্পেসের সাথে, যা ফু-বার.জম্প () ঘোষণার ফলস্বরূপ । আপনার বার ব্যবহার করে অপসারণ করতে হবে ;বিবৃতি
  • একটি পৃথক নাম দিয়ে নেমস্পেস বারটির নামকরণ করুন ।

আমার ক্ষেত্রে, একটি ডাটাবেস.সেটআইনিটিয়ালাইজার () কলটিতে একটি ইএফ ( সত্তা ফ্রেমওয়ার্ক ) সংগ্রহস্থল প্রকল্পে ভাঁজ করা সংকলক ত্রুটি ঘটেছে :

Member 'Database.SetInitializer<MyDatabaseContext>(IDatabaseInitializer<MyDatabaseContext>)' cannot be accessed with an instance reference; qualify it with a type name instead MyProject.ORM

আমি একটি মাইপ্রজেক্ট.আরএম যুক্ত করলে এই ত্রুটিটি জাগ্রত হয়। ডাটাবেস নেমস্পেস, যা আপনি লক্ষ্য করেছেন সূফিক্স ( ডাটাবেস ), ডেটাবেস সাথে মেলে .সেটআইনিটিয়ালাইজার শ্রেণীর নাম।

এই, আমি মতিন এর উপর কোন নিয়ন্ত্রণ আছে যেহেতু ডাটাবেজ স্ট্যাটিক শ্রেণী এবং আমিও আমার কাস্টম নামস্থান সংরক্ষণ হবে, আমি সম্পূর্ণরূপে মতিন এর ডাটাবেজ স্ট্যাটিক বর্গ তার namepace সঙ্গে যোগ্যতা অর্জন সিদ্ধান্ত নিয়েছে System.Data.Entity , যা নিম্নলিখিত কমান্ড ব্যবহার করে ফলে, যা সংকলন সফল:

System.Data.Entity.Database.SetInitializer<MyDatabaseContext>(MyMigrationStrategy)

আশা করি এটা সাহায্য করবে


1

আমি এখানে সি # সংকলক ত্রুটি CS0176, (সদৃশ) প্রশ্নের স্থির সদস্যের উদাহরণ রেফারেন্স ইস্যুর মাধ্যমে গুগল পেয়েছি ।

আমার ক্ষেত্রে, ত্রুটিটি ঘটেছে কারণ আমার স্থির পদ্ধতি এবং একই নামের সাথে একটি এক্সটেনশন পদ্ধতি ছিল। তার জন্য, স্থিতিক পদ্ধতি এবং একই নামের সাথে সম্প্রসারণের পদ্ধতিটি দেখুন

[হতে পারে এটি একটি মন্তব্য করা উচিত ছিল। দুঃখিত যে আমার এখনও যথেষ্ট খ্যাতি নেই]]


1

এর ফলে ত্রুটি ঘটে:

MyClass aCoolObj = new MyClass();
aCoolObj.MyCoolStaticMethod();

এটি স্থির:

MyClass.MyCoolStaticMethod();

ব্যাখ্যা:

আপনি কোনও অবজেক্টের উদাহরণ থেকে স্থির পদ্ধতিতে কল করতে পারবেন না। স্থির পদ্ধতিগুলির পুরো বিন্দুটি অবজেক্টগুলির উদাহরণগুলির সাথে আবদ্ধ না হওয়া, বরং তার পরিবর্তে object বস্তুর সমস্ত দৃষ্টান্ত ধরে রাখা এবং / অথবা অবজেক্টের কোনও উদাহরণ ছাড়াই ব্যবহার করা।


0
YourClassName.YourStaticFieldName

আপনার স্থির ক্ষেত্রের জন্য দেখতে এই রকম হবে:

public class StaticExample 
{
   public static double Pi = 3.14;
}

অন্য শ্রেণীর থেকে, আপনি নীচের মত স্ট্যাক ফিল্ড অ্যাক্সেস করতে পারেন:

    class Program
    {
     static void Main(string[] args)
     {
         double radius = 6;
         double areaOfCircle = 0;

         areaOfCircle = StaticExample.Pi * radius * radius;
         Console.WriteLine("Area = "+areaOfCircle);

         Console.ReadKey();
     }
  }

সম্ভবত আপনি প্রশ্নের সমাধানে আপনার সমাধানটি অনুবাদ করতে পারেন এবং শ্রেণি সংজ্ঞা এবং উদাহরণগুলির সাথে স্থির ক্ষেত্রগুলি কীভাবে কাজ করে সে সম্পর্কে কিছুটা ব্যাখ্যা করতে পারেন?
notetix

আপনার মন্তব্যের জন্য আপনাকে ধন্যবাদ, এখন কীভাবে @ অ্যালেক্স?
হেডেগো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.